Intellij IDEA中maven项目打包问题
学习使用java写项目的时候,java的jar包对我来说是很神奇又很复杂不想去了解的东西,如今形势所迫开始写java项目,做了些了解,也有几个问题。
1、其中一个打包方式
在pom文件中输入如下插件(在<project>的里面),然后点击右边栏偏上那个“m”字,进入maven,选中项目下Lifecycle/package,然后运行maven中上方的运行小三角。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.lwx.sha256.main</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
注意:上面的<transformer>的<mainClass>指定了程序main函数入口所在的类
2、关于package
其实java文件的package我一开始是不用的,因为其他语言不需要,而且不用也没见运行不了,所以我的代码都是如下所示。
但是在打包的那一步骤可以看出来我是在pom文件中直接指定了项目入口,然后我就被动了解了一下package,如果我的目录依旧如上图所示,而且入口是在main文件中的main.class,那么我在pom中写的应该是<mainClass>main</mainClass>,就没有什么com.xxx.xxx了,但是我突然觉得太不规范了,把目录改成如下图所示:
3、关于java的jre和jdk
如果你上传jar到远端服务器,并且报了如下错误:
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/JarLauncher : Unsupported major.minor version 52.0
正经来说就是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误。最终是查到了解决方法,在pom中加入如下的配置,指定编译版本,这里指定1.7:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>7</source> <target>7</target> </configuration> </plugin>
之前有尝试更改jre版本,但其实这是java compiler的问题。
另外关于jre和jdk我还是云里雾里,即使网上一套一套讲了许多,但是我明知道java项目中package的规范,但是学习的时候死记,真正在用的时候还是会偷懒不建包。大概多用几次就能更加清楚两者的区别吧
查看版本
#查看jre版本 $ java -version #查看jdk版本 $ javac -version