在Maven中如何从生成的jar中排除资源?
当我创build一个带有依赖关系的可执行jar(使用本指南 )时,所有的属性文件也被打包到jar中。 如何阻止它发生? 谢谢。
更新:我尝试使用Maven资源插件排除它们,但是当我在Eclipse中运行它时,我的应用程序将找不到属性文件(右键单击模块 – >运行方式 – > Java应用程序)
更新:感谢您的有用答案。 我想我最好花时间学习Maven,现在我只是select最简单的解决scheme。
把这些属性文件放在src/test/resources
。 在Eclipse中, src/test/resources
中的文件可以通过eclipse:eclipse
自动使用,但不会被Maven包含在打包的JAR中。
要从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>
按照惯例,目录src/main/resources
包含应用程序将使用的资源。 所以Maven会把它们包含在最终的JAR
。
因此,在您的应用程序中,您将使用getResourceAsStream()
方法访问它们,因为资源是在类path中加载的。
如果您需要在应用程序之外使用它们,请不要将它们存储在src/main/resources
因为它们将被Maven捆绑在一起。 当然,你可以排除它们(使用chkal给出的链接),但是为了保持关于src/main/resources
目录的约定,最好创build另一个目录(例如src/main/external-resources
)。
在后一种情况下,您将不得不独立地提供资源作为JAR文件(这可以通过使用Assembly插件来实现)。 如果您需要在Eclipse环境中访问它们,请转到项目的“ Properties
”,然后在“ Sources
文件”的“ Java Build Path
选项卡中添加该文件夹(例如src/main/external-resources
)。 然后Eclipse将在类path中添加这个目录。
你的意思是位于src/main/resources
属性文件吗? 那么你应该使用maven-resource-plugin排除它们。 有关详细信息,请参阅下一页。
http://maven.apache.org/plugins/maven-resources-plugin/examples/include-exclude.html
这要求使用Maven JAR插件
例如,如果你想排除最后一个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/
下的文件仍然可以在类path上使用,它们只是不会生成JAR文件。
当我创build一个具有依赖关系的可执行jar(使用本指南)时,所有的属性文件也被打包到jar中。 如何阻止它发生? 谢谢。
属性文件从哪里来? 你的主要jar子? 依赖?
在前一种情况下,按照build议将资源放在src/test/resources
resources下可能是最直接和最简单的select。
在后面的例子中,你将不得不在unpackOptions
创build一个特殊的excludes/exclude
assembly描述符。
另一种可能是使用Maven Shade插件 ,例如排除只在本地IDE中使用的日志logging属性文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>${maven-shade-plugin-version}</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>log4j2.xml</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
然而,这将会排除每个工件的文件,所以在任何情况下都是不可行的。