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

时间:2010-11-06 15:20:38

标签: maven

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

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

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

8 个答案:

答案 0 :(得分:103)

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

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

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>*.properties</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

答案 1 :(得分:17)

按照惯例,目录src/main/resources包含应用程序将使用的资源。所以Maven会将它们包含在最终的JAR中。

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

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

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

答案 2 :(得分:10)

将这些属性文件放在src/test/resources中。 src/test/resources中的文件在Eclipse中通过eclipse:eclipse自动提供,但不会被Maven包含在打包的JAR中。

答案 3 :(得分:8)

您是指src/main/resources中的属性文件吗?然后你应该使用maven-resource-plugin排除它们。有关详细信息,请参阅以下页面:

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

答案 4 :(得分:6)

这完全要求使用Maven JAR Plugin

例如,如果要从最终jar中排除src/test/resources/下的所有内容,请输入:

<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>

...

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

答案 5 :(得分:4)

使用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>

答案 6 :(得分:1)

  

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

属性文件从哪里来?你的主罐?依赖?

在前一种情况下,按照建议将资源置于src/test/resources之下可能是最直接和最简单的选择。

在后一种情况下,您必须在unpackOptions中创建一个带有特殊excludes/exclude的自定义程序集描述符。

答案 7 :(得分:1)

另一种可能性是使用Maven Shade Plugin,例如排除仅在IDE本地使用的日志记录属性文件:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.Azure.Plugins.Diagnostics.dll.RoleInformation.get_IsWorkerRole()

但是,这将从每个工件中排除文件,因此在任何情况下都可能不可行。