在Maven中如何从生成的jar中排除资源?

Hai*_*yen 56 maven

当我创建一个带有依赖项的可执行jar时(使用本指南),所有属性文件也都打包到该jar中.如何阻止它发生?谢谢.

更新:我尝试使用Maven资源插件排除它们,但是当我在Eclipse中运行它时,我的应用程序将找不到属性文件(右键单击模块 - >运行方式 - > Java应用程序)

更新:感谢您的有用答案.我想我最好花时间学习Maven,现在我只选择最简单的解决方案.

小智 106

要从jar/target目录中排除任何文件,可以使用<excludes>pom.xml文件中的标记.

在下一个示例中,.properties将不包含具有扩展名的所有文件:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>*.properties</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这个答案(http://stackoverflow.com/a/3004684/363573)提供了一种更优雅的方法来使用maven jar插件排除不需要的资源. (18认同)
  • 如果我没有错,则此解决方案存在问题,因为它会从所有插件中排除这些文件.如何将它们从程序集插件中排除?我在插件标记中的配置标记内尝试了相同的配置,但它不起作用 (8认同)
  • 即使在IDEA制作模块时,这也会泄露它们,我只想在打包时将其排除,怎么样? (2认同)

Rom*_*las 17

按照惯例,该目录src/main/resources包含应用程序将使用的资源.所以Maven将他们列入决赛JAR.

因此,在您的应用程序中,您将使用该getResourceAsStream()方法访问它们,因为资源已加载到类路径中.

如果您需要将它们放在应用程序之外,请不要存储它们,src/main/resources因为它们将由Maven捆绑.当然,您可以排除它们(使用chkal给出的链接),但最好创建另一个目录(例如src/main/external-resources)以保持有关src/main/resources目录的约定.

在后一种情况下,您必须独立地作为JAR文件提供资源(这可以通过使用Assembly插件来实现).如果需要在Eclipse环境中访问它们,请转到Properties项目,然后Java Build PathSources选项卡中添加文件夹(例如src/main/external-resources).然后,Eclipse将在类路径中添加此目录.


小智 11

将这些属性文件放入src/test/resources.src/test/resourcesEclipse中的文件可以自动通过,eclipse:eclipse但不会被Maven包含在打包的JAR中.

  • 这是一个错误的答案,因为它是Eclipse特定的,依赖于Eclipse无法为main和test实现单独的类路径.其他IDE具有单独的类路径,因此您的代码将无法在这些IDE中运行.希望Eclipse在某些方面也会有单独的类路径. (50认同)

chk*_*kal 8

你的意思是位于的财产档案src/main/resources?然后你应该使用maven-resource-plugin排除它们.请参阅以下页面了解详细信息:

http://maven.apache.org/plugins/maven-resources-plugin/examples/include-exclude.html


Don*_*dle 7

这完全要求使用Maven JAR插件

例如,如果src/test/resources/要从最终jar中排除所有内容,请将其放入:

<build>

        <plugins>
            <!-- configure JAR build -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <excludes>
                        <exclude>src/test/resources/**</exclude>
                    </excludes>
                </configuration>
            </plugin>

...
Run Code Online (Sandbox Code Playgroud)

下面的文件src/test/resources/仍然可以在类路径上使用,它们不会在结果JAR中.

  • `<exclude> src/test/resources/**</ exclude>`不起作用.排除将应用于jar最终路径,应该是"<exclude>*.properties </ exclude>" (7认同)

Rad*_*unj 6

使用maven-jar-plugin创建maven jar时,排除文件的特​​定模式。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.3</version>
  <configuration>
    <excludes>
      <exclude>**/*.properties</exclude>
      <exclude>**/*.xml</exclude>
      <exclude>**/*.exe</exclude>
      <exclude>**/*.java</exclude>
      <exclude>**/*.xls</exclude>
    </excludes>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)