Maven“shaded”JAR在文件名中以“original”为前缀

时间:2010-11-03 15:28:32

标签: java maven-2

我正在使用“shade”Maven2插件来构建一个单独的JAR,并将所有Java依赖项捆绑在一起。 pom.xml中的相关部分非常简单:

<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>
                <finalName>${project.artifactId}-${project.version}-SHADED</finalName>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.mypackage.MyClass</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

但是,构建结果很奇怪。看来这两个文件实际上是由这个Maven插件创建的:

myartifact-1.0.0-SHADED.jar  (zero bytes)
original-myartifact-1.0.0-SHADED.jar  (10 MB)

前缀为“original”的JAR文件已正确构建,并且运行正常。我想我可以重命名它以剥去那个前缀,并继续我的快乐方式。

然而,我非常好奇这里的“阴影”插件可能会发生什么。看起来“原始”文件是临时工作空间类型的东西,打算在进程结束时重命名,并且最终重命名根本不会完成。但是,没有明显的解释(即文件系统权限等)。有没有人见过这个?

3 个答案:

答案 0 :(得分:48)

我知道这个问题很老,但认为值得添加以下信息。

我认为史蒂夫最初想要的输出是在maven-shade-plugin documentation的这个页面上给出的。

<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>

答案 1 :(得分:20)

Maven的构建步骤将创建jar target/artifact-version.jar

然后阴影插件运行。它通常会将该jar重命名为target/original-artifact-version.jar,并为着色的JAR指定名称target/artifact-version.jar

但是,您正在配置Shade插件以使用其他名称。除非有充分理由,否则我会从您的配置中删除<finalName>,并使用Shade插件希望为您提供的内容。

答案 2 :(得分:7)

跟随@Stewart提供一个更好的答案(对任何一个都没有冒犯:D):

你得到原始混乱的原因可能是双重的:

  1. 指定<finalName>表示您希望名称与Maven默认提供的名称不同(即:与工件名称相同:artifactId-version.jar或artifactId-version-shaded.jar)。如果你指定的最终名称与两者中的一个相同,它会尝试将原来的名称作为原始名称 - *。jar,然后用新的阴影覆盖它。在你的情况下,你告诉它制作最终的JAR * -shaded.jar,这是Maven出现的情况(默认情况下它们进入artifactId-version.jar之前),所以它首先支持将旧*-shaded.jar作为original-*-shaded.jar向上,然后在将字节写入新*-shaded.jar时将其删除,因为旧字节消失了(它们似乎重命名)。

  2. (这是我的情况)使用<shadedClassifierName>,只更改Maven用于生成* -shaded.jar的后缀,与<finalName>结合使用也可以产生相同的结果。如果您愿意,可以使用<shadedClassifierName>并指定不同的后缀并完成后续操作,而无需指定<finalName>。在我的情况下,我设置了输出相同的名称:ie:artifactId-version-all.jar但使用'all'作为分类器使我回到#1中描述的场景。