一、如何运行SpringBoot jar包中的指定main函数
测试类包含了主函数,被一起打到了jar包中。但是如果执行:
java -jar test.jar
那么会执行web服务的主函数。
我们如何指定执行测试类中的主函数呢? 一开始是想到用:
java -cp test.jar com.my.TestClass
但是提示无法找到主函数:Error: Could not find or load main class
原因是SpringBoot打包时,把所有的类都放到了BOOT-INF/classes下,而BOOT-INF不是一个合法的包名。 其实正确的方法如下:
java -cp test.jar -Dloader.main=com.my.TestClass org.springframework.boot.loader.PropertiesLauncher
启动的主函数是org.springframework.boot.loader.PropertiesLauncher,让它去找到TestClass执行
---------------------------------------------------------------------------
二、对后续测试的说明
对下面测试的说明:
testAxis2Springboot.jar :IDEA 工具打的包 File-->Project Structure..-->选择Artifacts,点击“+”号,选择JAR,点击From modules with dependencies
testAxis2Springboot-0.0.1-SNAPSHOT.jar :Springboot工具打的包
其他的*.jar :手工打的包
其中: lib目录是使用IDEA工具打包时,JAR files from libraries的选项是第二项【copy to the output directory and link via manifest】时生成的lib目录
---------------------------------------------------------------------------
三、对于非Springboot jar的运行
对于非Springboot jar,不需要带最后的参数。如果需要依赖包,则需要在 -classpath(-cp) 加上依赖包
3.1、无依赖的main的运行:
jar cvfe my.jar com.myprog.common.XmlFormater com\myprog\common\XmlFormater.class
java -jar my.jar
3.2、对需要依赖类的运行方法:
jar cvfe mytest.jar com.myprog.clients.test_Clients com\myprog\
#这样运行不可以,总是提示找不到依赖包
java -classpath D:\classes\lib\* -jar mytest.jar
#需要这样运行:
java -Djava.ext.dirs=lib -jar mytest.jar
java -Djava.ext.dirs=D:\classes\lib -jar mytest.jar
java -Djava.ext.dirs=lib -cp mytest.jar com.myprog.clients.test_Clients
上面这种没法运行,总是提示找不到依赖包,是因为 META-INF\MANIFEST.MF 是打包工具自己建的且没法修改,且里面没有登记依赖包。
执行指定类:
java -Djava.ext.dirs=lib -cp testAxis2Springboot.jar com.myprog.clients.test_Clients
java -Djava.ext.dirs=lib -cp testAxis2Springboot.jar com.myprog.common.XmlFormater
去掉--Djava.ext.dirs参数,把这个jar拷贝到lib目录下也可以:
java -cp lib\* com.myprog.clients.test_Clients
执行指定类,这样成功:
java -cp testAxis2Springboot.jar;lib\* com.myprog.clients.test_Clients
java -cp testAxis2Springboot.jar;lib\* com.myprog.common.XmlFormater
SpringBoot打包的,不能这样执行:原因上面有说明,要用上面第一个方法运行。
java -cp testAxis2Springboot-0.0.1-SNAPSHOT.jar;lib\* com.myprog.clients.test_Clients
----------------------------------------------------------------------------------
四、以下三种打包的测试:
4.1、打包
call mvn clean
call mvn compile
cd target\classes
@echo 指定主类打包……
jar cvfe xml.jar com.myprog.common.XmlFormater com\myprog\
jar cvfe mytest.jar com.myprog.clients.test_Clients com\myprog\
@echo 不指定主类打包……
jar cvfM myprog.jar com\myprog\
copy *.jar D:\classes\
cd /D D:\classes\
4.2、运行
这样运行都是成功的:
java -Djava.ext.dirs=lib -jar mytest.jar
java -Djava.ext.dirs=lib -cp xml.jar com.myprog.clients.test_Clients
java -Djava.ext.dirs=lib -cp myprog.jar com.myprog.clients.test_Clients
java -cp mytest.jar;lib\* com.myprog.clients.test_Clients
java -cp xml.jar;lib\* com.myprog.clients.test_Clients
java -cp myprog.jar;lib\* com.myprog.clients.test_Clients
这是失败的:
java -cp lib\* -jar mytest.jar
对于纠结于怎么运行jar里面的自己的主类的朋友,希望对你们有所帮助。
End。