为啥 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/classestarget 目录中的 JAR 中,仅此而已。所以,当你运行mvn jar:jar 时,你的pom 中的插件配置 使用了,但是jar:jar 不会做比我提到的更多的事情。如果target/classes 为空或不存在,则生成的 JAR 中不会打包任何类或资源。

package 阶段是build lifecycle phase,当您调用mvn package时,之前的所有阶段将执行packageprocess-resources,@ 987654335@、process-test-resources 等)并将触发插件目标bound to these phases。因此,对于&lt;packaging&gt; 类型为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包是为啥

请问maven工程jar包,war包,pom打包,都是怎么定的?

maven工程为啥打成jar包能用在war包上用不了

maven为啥更新不下来新jar包?

maven 本地仓库 有jar 为啥 还报错

nexus 为啥没有jar包