Intellij打包Maven项目中那些七七八八

本文介绍了如何在Maven项目中正确配置并打包项目,使其能够通过java-jar指令直接运行,包括设置Main-Class属性及解决依赖问题的方法,并讨论了JDK版本不匹配导致的UnsupportedClassVersionError错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖问题

Maven生成的项目中,如果直接使用java -jar xxx.jar指令运行jar文件,会出现”no main manifest attribute, in xxx.jar”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。
要想jar包能直接通过java -jar xxx.jar运行,需要满足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;
2、要能加载到依赖包。
可以使用插件来解决打包依赖的问题;
修改pom文件, 在</dependencies>后面加上以下内容:

<build> 
  <plugins> 
    <plugin> 
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-assembly-plugin</artifactId>  
      <!--  <version>2.2-beta-5</version> -->  
      <version>2.6</version>  
      <configuration> 
        <archive> 
          <manifest> 
            <mainClass>task.PersonalInfoTask</mainClass> 
          </manifest> 
        </archive>  
        <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
      </configuration>  
      <executions> 
        <execution> 
          <id>make-assembly</id>  
          <phase>package</phase>  
          <goals> 
            <goal>single</goal> 
          </goals> 
        </execution> 
      </executions> 
    </plugin> 
  </plugins> 
</build>

打包时,使用Maven Project视图里的package进行打包。

主函数问题

调用时,如果想运行时指定想要运行的类,此时应该用-cp / –classpath来指定,例如:

java -cp XXX.jar com.HelloWorld

运行时报错UnsupportedClassVersionError

出错信息如下:

Exception in thread "main" java.lang.UnsupportedClassVersionError: task/PersonalInfoTask : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

其原因在于jar包的打包环境和运行环境的JDK版本不同,在开发环境中更改下再打包就可以了。
52代表jdk1.8,具体对照表如下:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值