新手入门,今天想要尝试命令行手动打包下jar包,并直接执行jar包。
于是写了一段最经典的helloworld
public class hello{
public static void main(String[] args){
System.out.println("Hello World");
}
}
E:\JDK8\jre>javac -classpath D:\zhuomian D:\zhuomian\hello.java
接着便开始打包jar包:
E:\JDK8\jre>jar -cvfm D:\zhuomian\hello.jar D:\zhuomian\manf D:\zhuomian\hello.class
执行jar:
E:\JDK8\jre>java -classpath D:\zhuomian -jar D:\zhuomian\hello.jar
错误: 找不到或无法加载主类 hello
在网上寻找一番后,发现普遍都是由于manifest文件导致或者拥有多个jdk版本不一致导致:
而我所打的jar包已经导入了清单,并且已经设别出我想要的主入口信息,应该不是这个问题,另外jdk我也只装了一个,也不是版本冲突问题。
在操作过程中,我发现-jar 大概映射的就是manifest里设定的主入口信息,于是我直接不用-jar,直接填入我需要的主入口:
E:\JDK8\jre>java -classpath D:\zhuomian -jar D:\zhuomian\hello.jar
错误: 找不到或无法加载主类 hello
E:\JDK8\jre>java -classpath D:\zhuomian hello D:\zhuomian\hello.jar
Hello World
结果成功执行,因此很疑惑为什么-jar明明映射的也是我想要的入口,但却无法找到或加载?
你的jar包应该是没打好的。
测试一个jar包,直接通过 java -jar jar包测试。
1)<includeSystemScope>为true:代表maven打包时会将外部引入的jar包打包到项目jar,在服务器上项目才能运行,不加此配置,本地可以运行,因为本地可以在lib下找到外部包,但是服务器上jar中是没有的;
(2)<mainClass>: 指定入口主方法;
(3) <goal>repackage</goal>:个人认为重新打包会自动检测到入口类。本项目必须指定,不指定就会报没有主清单属性
<build>
<plugins>
<!-- 该插件的主要功能是进行项目的打包发布处理 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 设置程序执行的主类 -->
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>${main.class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>