【问题标题】:Best practice for packaging resource files and classes with Maven使用 Maven 打包资源文件和类的最佳实践
【发布时间】:2014-06-24 07:21:23
【问题描述】:

目前我有一个示例 maven 项目,其中包含以下 build 部分,我在其中指定了第二个资源位置目录:

<project>
...
<build>
    <resources>
        <resource>
            <directory>src/main/second-resources</directory>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <finalName>${artifactId}</finalName>
                <outputDirectory>${jarBuildPath}</outputDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

我可以使用此配置打包我的 jar,让我的类和资源文件位于正确的位置并且没有问题。

但是当将属性 &lt;classesDirectory&gt; 添加到我的 maven-jar-plugin 配置 sn-p 时,其值为 src/main/java

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.4</version>
    <configuration>
      <classesDirectory>src/main/java</classesDirectory>
      <finalName>${artifactId}</finalName>
      <outputDirectory>${jarBuildPath}</outputDirectory>
    </configuration>
 </plugin>

然后在打包我的存档时,见鬼,我的资源文件不再存在

来自 maven official documentation for the classesDirectory property,它说 包含应该打包到 JAR 中的类和资源文件的目录。 这对我来说很有意义,它是很公平,我的资源文件消失了,因为 maven 假定没有文件有权被打包,除非它位于 src/main/java 下。

但我最大的想法是在指定我的资源文件位置时(使用以下选项之一),即使我指定了 &lt;classesDirectory&gt; 条目,Maven 也会知道文件位置。

有顶级&lt;resources&gt;入口

<resources>
  <resource>
  <directory>src/main/second-resources</directory>
  </resource>
</resources>

或通过 maven-resource-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>2.6</version>
    <configuration>
      <resources>
        <resource>
          <directory>src/main/second-resources</directory>
        </resource>
      </resources>
    </configuration>
  </plugin>

我可以告诉你,我对 maven 很熟悉,但这个问题对我来说似乎很奇怪:当你有一些自定义资源目录时,不建议在 maven-jar-plugin 中使用吗?

任何人都可以对此有所了解吗?

BR。

【问题讨论】:

  • 你想完成什么? 默认情况下包含 src/main/resources。
  • @bmargulies 感谢您的关注。是的,我知道这两个,但实际上我在拥有另一个自定义资源文件目录/路径时正在考虑这一点。
  • 你把它放在顶级 元素中,而不是在插件配置中。
  • 标签&lt;classesDirectory&gt; 应该包含.class 文件,因此它应该指向target/classes(这是默认值)而不是src/main/java。如果要捆绑源文件,请查看source plugin
  • 是的,class 始终是编译文件(即 .class 文件)的提示,另一方面,source.java 文件

标签: java maven jar maven-resources-plugin maven-jar-plugin


【解决方案1】:

classesDirectory 是目录

  • 编译器插件存储已编译的 java 类
  • resources-plugin 复制要包含在文件中的资源 由 jar 插件创建。

您已将其更改为 jar-plugin 配置中的 java 源代码目录。

因此,我想你的 jar 现在只包含 java 源文件。

这是您想要的,还是您只是想包含第二个资源文件来源?

如果是后者,那么只需添加:

<resources>
  <resource>
      <directory>src/main/resources</directory>
  </resource>
  <resource>
      <directory>src/main/second-resources</directory>
  </resource>
</resources>

应该在不向 jar 插件添加任何配置的情况下完成你想要的。请注意,如果您在默认 src/main/resources 位置仍有所需的内容,则需要第一个 .. 部分。

【讨论】:

  • 因此,如果我想在 maven-jar-plugin 中添加不同的 &lt;classesDirecory&gt;,我还应该更改资源和编译插件目标路径(它们存储 @987654323 的位置@ 和资源文件*),对吗?我怎么能这样做?
  • 您是否有意在您的 jar 中包含 java 源文件?也许你应该准确地解释你想要做什么。
  • 主要问题现在已经相当清楚了,因为所有内容都是关于混淆类和源的。但我只是想知道如何让 maven-jar-plugin 从另一个目录而不是 target/classes 读取类? maven-resource/compile-plugins 应该如何分别配置?有什么想法吗?
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 2021-12-28
  • 2013-05-04
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多