window命令行打包jar文件,执行时-jar导入了清单却无法加载主类。

新手入门,今天想要尝试命令行手动打包下jar包,并直接执行jar包。
于是写了一段最经典的helloworld

public class hello{
    public static void main(String[] args){
        System.out.println("Hello World");
    }
}
  1. 首先将java文件编译成class文件:
    E:\JDK8\jre>javac  -classpath D:\zhuomian D:\zhuomian\hello.java
    
  2. 创建manf文件:

    img

  1. 接着便开始打包jar包:

    E:\JDK8\jre>jar -cvfm   D:\zhuomian\hello.jar  D:\zhuomian\manf  D:\zhuomian\hello.class   
    
  2. 执行jar:

    E:\JDK8\jre>java -classpath D:\zhuomian -jar D:\zhuomian\hello.jar
    错误: 找不到或无法加载主类 hello
    

在网上寻找一番后,发现普遍都是由于manifest文件导致或者拥有多个jdk版本不一致导致:

  • manifest文件需注明主类入口,并且注意格式,或者打包时创建manf文件一起打包

img

而我所打的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>