Maven shade插件将dependency-reduced-pom.xml添加到基础目录

71

maven shade插件正在创建一个名为dependency-reduced-pom.xmlartifactname-shaded.jar的文件,并将它们放置在基本目录中。

这是一个bug吗?它应该在目标目录中。有什么解决方法吗?

6个回答

83
你可以通过将createDependencyReducedPom设置为false来避免其创建。例如:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>${maven-shade-plugin.version}</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    ....
    ....
</plugin>

请查看http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#createDependencyReducedPom

<createDependencyReducedPom>

该标志用于决定是否为生成的Shaded artifact(阴影打包后的Jar包)生成一个简化版的POM文件。如果设置为true,则会将已经包含在Uber JAR中的依赖从生成的POM文件的dependency部分中移除。这个简化版本的POM文件被命名为dependency-reduced-pom.xml并存储在与阴影打包后的artifact相同的目录下。除非您还指定了dependencyReducedPomLocation,否则插件将在项目基本目录中创建一个名为dependency-reduced-pom.xml的临时文件。

  • Type: boolean
  • Required: No
  • Default: true

20
如果你关闭它,那么你构建的东西将仍然将所有合并的依赖项列为依赖项。 - bmargulies

22
根据 bmargulies 的回答和他对 Xv. 答案的评论,我决定将精简依赖关系的 POM 配置为输出到target/,这已经被我的版本控制系统忽略了。
为此,我只需将dependencyReducedPomLocation元素添加到插件的configuration元素中,即可。
<configuration>
  <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>
  (...)
</configuration>

3
注意,从插件文档中可知:"dependency reduced pom 应该放在哪里。注意:如果将该参数的值设置为 ${basedir} 以外的目录,则会改变所有在 shade 执行之后执行的操作的 ${basedir} 值。这通常不是您想要的。这被认为是该插件的一个未解决问题。" - Alexander Pogrebnyak

10

2
你能解释一下我们应该如何处理这个生成的pom文件吗? - Cristiano
1
请将其添加到您的 .gitignore 文件中或在其中设置 svn:ignore。Maven 使得它可以包含在 shaded jar 中。 - bmargulies
5
“你可能不喜欢后果”是什么意思?负面后果有哪些? - Gili

3
您可以使用旧版本的插件。Maven Shade插件的1.7版本会写入到/target目录。
从1.7.1版本开始,dependency-reduced pom.xml将被写入basedir。请参考问题MSHADE-124了解为什么要这样做以及其后果。如果尝试设置dependencyReducedPomLocation,可能会遇到生成网站时的问题 - 开放问题MSHADE-145

1

http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html 上的文档是错误的,因为它说:

createDependencyReducedPom boolean - 是否生成简化的 POM 文件。如果设置为 true,则已包含在 uber JAR 中的依赖项将从生成的 POM 的 section 中删除。简化的 POM 将命名为 dependency-reduced-pom.xml,并存储在与 shaded artifact 相同的目录中。除非您还指定了 dependencyReducedPomLocation,否则插件将在项目 basedir 中创建一个临时文件 named dependency-reduced-pom.xml。默认值为:true。

dependency-reduced-pom.xml 实际上不会存储在与 shaded artifact 相同的目录(target directory)中... 它实际上是在基本目录中生成的,而不是 target 目录。


8
他们写道(即使在你的回答中也可以看到):“插件将在基于项目目录的位置创建一个名为dependency-reduced-pom.xml的临时文件”。 - OhadR

0

如果要忽略文件,您可以将其添加到 DVCS 的 ignore 指令中。对于 git,会创建一个名为 .gitignore 的文件,并包含以下内容:

dependency-reduced-pom.xml

你还可以将其添加到maven-clean-plugin配置中,以便在clean生命周期阶段期间被删除:(以下假定默认值,如版本,在POM的pluginManagement部分中定义。)
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-clean-plugin</artifactId>
                    <configuration>
                        <filesets>
                            <fileset>
                                <directory>.</directory>
                                <includes>
                                    <include>**/dependency-reduced-pom.xml</include>
                                </includes>
                                <followSymlinks>false</followSymlinks>
                            </fileset>
                        </filesets>
                    </configuration>
                </plugin>
            </plugins>
        </build>

请注意,上述配置是对非定制的干净默认设置进行添加。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接