我有两个Maven模块,A
和B
。 A
是B
的依赖关系。两个模块都有一个名为default.properties
的资源文件位于src/main/resources
。我需要在两个项目中保持文件名相同并且文件的位置相同,因为A
和B
都使用代码,该代码期望文件被命名并位于其所在的位置。构建B
时,A
的默认属性位于最终jar
。我希望在构建B
时拥有B
的属性。我怎么能这样做?
答案 0 :(得分:6)
好的,Maven Resources Plugin和Assembly插件没有削减它,所以我挖了更多。
Maven Shade plugin似乎可行。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- Main class -->
<mainClass> <!-- fully qualified package and class name --> </mainClass>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</transformer>
</transformers>
<filters>
<filter>
<artifact>org.something:SomeDependency</artifact>
<excludes>
<exclude>*.properties</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
所以,在<configuration> ... </configuration>
-tags中我定义了两件事:一个转换器实现,负责修改jar-manifest可运行,并使用当前目录作为classpath root,并排除所有从依赖org.something内部以.properties结尾的文件:SomeDependency。
实际的过滤部分是您可以排除您不想在由阴影构建的最终jar中最终的文件。您可以使用<artifact>*:*</artifact>
中的<filter>
排除所有依赖项和当前项目中的文件,也可以使用<artifact>dependcyGroupId:dependencyArtifact</artifact>
仅选择某个依赖项,例如<artifact>junit:junit</artifact>
,甚至使用通配符表示其中一个(<artifact>*:junit</artifact>
)。然后在<excludes>...</excludes>
-tags内定义排除的文件。同样,您可以使用确切的文件名或通配符。这应该可以帮助您解决当前的问题,尽管我建议您从插件站点阅读文档,因为阴影可以比这更多。
答案 1 :(得分:6)
我知道这已经3年了,但我遇到了同样的问题,这是我发现的最接近的问题,但仍然没有正确的答案,所以也许有人会觉得它很有用。
基于jar-with-dependencies的maven-assembly描述符示例(修复了依赖项覆盖log4j.properties):
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<unpack>true</unpack>
<unpackOptions>
<excludes>
<exclude>log4j.properties</exclude>
</excludes>
</unpackOptions>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
关键是为依赖项和实际项目(层次结构顶部)提供不同的规则。可以使用<useProjectArtifact>false</useProjectArtifact>
拆分这些内容,并在fileSets
中为项目提供单独的规则。否则,log4j.properties
都不会被打包,包括最上面的一个。