为啥 Maven 目标“包”包含 jar 中的资源,而目标“jar:jar”不包含?
Posted
技术标签:
【中文标题】为啥 Maven 目标“包”包含 jar 中的资源,而目标“jar:jar”不包含?【英文标题】:Why does the Maven goal "package" include the resources in the jar, but the goal "jar:jar" doesn't?为什么 Maven 目标“包”包含 jar 中的资源,而目标“jar:jar”不包含? 【发布时间】:2010-05-07 08:12:04 【问题描述】:当我使用 Maven 目标“包”打包我的项目时,资源也包括在内。它们最初位于目录“src/main/resources”中。 因为我想创建一个可执行的 jar 并将类路径添加到清单中,所以我使用的是 maven-jar-plugin。
我已将其配置为以下喜欢:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>at.program.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
为什么用“jar:jar”创建的 jar 文件不包括我的资源。就我而言,它应该使用与“包”目标相同的目录(在我的情况下,它是从 Maven Super POM 继承的)。
【问题讨论】:
【参考方案1】:Maven JAR plugin 的jar:jar
目标用于“从当前项目构建一个 JAR”,它只做一件事:它将target/classes
到 target
目录中的 JAR 中,仅此而已。所以,当你运行mvn jar:jar
时,你的pom 中的插件配置被 使用了,但是jar:jar
不会做比我提到的更多的事情。如果target/classes
为空或不存在,则生成的 JAR 中不会打包任何类或资源。
package
阶段是build lifecycle phase,当您调用mvn package
时,之前的所有阶段将执行package
(process-resources
,@ 987654335@、process-test-resources
等)并将触发插件目标bound to these phases。因此,对于<packaging>
类型为jar
的项目,jar:jar
绑定到package
并将在package
阶段运行,但在此之前,绑定到package
之前阶段的目标将被触发,包括将资源复制到target/classes
。
【讨论】:
【参考方案2】:您可以尝试在您的 jar 插件配置中使用maven.jar.includes。
【讨论】:
这是针对 Maven 1 的,这个问题是关于 Maven 2 的。【参考方案3】:我发现,当项目打包设置为“jar”时,maven-jar-plugin 会自动将自身绑定到包目标。所以“包”目标完成了我想要的一切,包括将类路径附加到清单并设置一个主类。
【讨论】:
以上是关于为啥 Maven 目标“包”包含 jar 中的资源,而目标“jar:jar”不包含?的主要内容,如果未能解决你的问题,请参考以下文章
eclipse 中创建maven 项目pom.xml配置好了不自动下载jar包是为啥