如何配置Maven的application.properties以生成可运行JAR?
致后续读者
我提出此问题时,因误解了链接指南中一处易混淆的内容,未意识到application.properties文件与MANIFEST.MF文件是相互独立的,且后者无论如何都会由Maven自动生成。可查看下方了解生成可运行JAR的方法。
我的问题
我目前正在通过《Getting Started Guide》学习Maven基础,当看到JAR文件中非类资源的章节时,发现缺少关键信息。指南提到,可通过在Maven项目的资源目录下创建application.properties文件来生成清单文件,从而让JAR可执行,但未说明该文件内应填写的内容、格式,以及如何指定主类。
请问:
application.properties文件中可填写哪些信息?它的格式是什么?是否为标准Java.properties文件?若是,有哪些合法属性?- 如何在构件中指定主类,使得
mvn package生成的JAR可通过java -jar命令运行?
我尝试过多种搜索关键词(如"Maven application.properties file")但未得到有用答案,也浏览了入门指南的其余部分及Maven官网的部分内容,但因对Maven了解不足,无法完全理解。
解答
先澄清核心误解
首先要敲黑板:application.properties和MANIFEST.MF完全是两回事!前者是你的应用程序用来读取业务配置的资源文件,和生成可执行JAR的清单文件半毛钱关系都没有。入门指南这里的描述明显误导了你——Maven本来就会自动生成MANIFEST.MF,根本不需要通过application.properties来生成它。
关于application.properties
- 它就是标准的Java
.properties格式文件,用键值对的方式写配置,举个例子:app.title=我的第一个Maven应用 app.version=1.0.0 db.connection.url=jdbc:mysql://localhost:3306/test_db - 这个文件的作用是给你的Java代码提供可配置的参数,你可以用JDK自带的
Properties类,或者用Spring这类框架来读取里面的内容。只要把它放在src/main/resources目录下,Maven打包时就会自动把它放到JAR的根目录里。
如何生成可执行JAR(指定主类)
要让mvn package生成的JAR能用java -jar直接运行,核心是让Maven在自动生成的MANIFEST.MF里加上Main-Class属性,这里给你两种常用的方法:
方法1:用Maven Jar Plugin配置(基础版)
在项目的pom.xml里添加Jar插件的配置,指定主类的全限定名就行:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- 替换成你的主类全路径,比如com.example.MyAppMain --> <mainClass>你的包名.主类名</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
配置好后执行mvn package,生成的JAR里的MANIFEST.MF就会包含Main-Class条目,直接用java -jar target/你的JAR文件名.jar就能运行。
方法2:用Maven Assembly Plugin(含依赖打包版)
如果你的项目用到了外部依赖,上面的方法生成的JAR不会包含这些依赖,运行时得手动指定类路径。这时候可以用Assembly Plugin打包成一个包含所有依赖的“胖JAR”:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>你的包名.主类名</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,target目录里会生成一个带-jar-with-dependencies后缀的JAR,这个JAR把所有依赖都打包进去了,直接运行就行,不用管类路径的问题。
内容的提问来源于stack exchange,提问作者john01dav

