背景:新建一个maven工程(不是spring boot工程),打成jar包后放在linux系统上,通过java -jar xxx.jar
运行。
操作:
- 在pom.xml中添加
<packaging>jar</packaging>
- 在idea中通过package命令打包
- 将target下生成的jar包拉到linux下,并执行jar包如下:
情况1:
如果构建的是springboot项目,Main启动类应该在根路径下,打包的时候在pom.xml文件中应该加下面代码,这样在启动jar包的时候就能够自动检索启动类。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
情况2:
如果构建的不是springboot项目,即没有固定的启动类路径,则找到该执行哪个main,解决办法:在pom.xml中添加如下的代码,指定执行的main路径。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
//com.vis.datadetail.ReadTopoData是指定jar执行的main路径
<mainClass>com.vis.datadetail.ReadTopoData</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后再打包,用RAR打开jar包,会发现在META-INF中的MANIFEST.MF文件中多出了Main-Class指定要执行的main路径。
如果不想在pom.xml中指定main路径,或者jar中有多个main,可以在执行运行指令的时候通过命令,指定想要执行哪个main。参考执行jar包中指定main方法。
有的博客说手动改META-INF中的MANIFEST.MF文件,直接指定Main-Class,感觉理论上应该可行,毕竟打包的时候会根据pom.xml中配置的<plugin>
生成MANIFEST.MF文件,但我没有成功,上述修改pom.xml指定main路径的方法亲测有效。