如何配置Maven Shade插件以在JAR包中包含测试代码?

16

我使用 Shade Maven插件构建我的项目,以便将所有依赖项包含在一个jar文件中(这使得在Hadoop上运行它更加容易)。Shade似乎默认情况下排除我的测试代码,这是可以理解的。由于我希望针对我的集群运行集成测试,因此我希望设置另一个配置文件来构建一个单独的jar文件用于此目的。是否有办法配置此插件以包括测试代码?


这更像是一种解决方法而不是直接的答案,但我最终在项目中添加了一个test-jar目标,其中包含测试,并向我的shale-built项目添加了另一个依赖项(带有“tests”分类器)。虽然不是理想的解决方案,但现在我的shale构建的jar文件也包括测试。 - Patrick Marchwiak
您能提供您所做的一个例子吗?我是 Maven 的新手,不理解如何向项目添加目标或依赖项分类器。 - divegeek
1
将以下内容添加到 pom 的构建部分,以便重用测试: maven-jar-plugin test-jar package test-jar 使用 "tests" 分类器依赖于该测试 jar 包: com.abc blah 1.0 tests test - Patrick Marchwiak
@PatrickMarchwiak,您能展示一下您是如何解决这个问题的吗? - Eidan Spiegel
我使用汇编插件得到了这个主题的工作解决方案:https://dev59.com/4Wkv5IYBdhLWcg3w3EWl#36058365 - A_Di-Matteo
5个回答

12
这些最近的几个答案充其量只是针对一个有缺陷的功能的混乱解决方法。事实仍然存在,maven-shade-plugin中存在漏洞。同时,我已经调查并找到了漏洞,并创建了一个补丁。现在我希望Apache的某个人很快就会包含它,然后最终shadeTestJar功能可以像它应该的那样工作。

9
使用maven-shade-plugin的2.2版本后,他们增加了"shadeTestJar"选项(详见MSHADE-158):http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadeTestJar。然而,我尝试使用它但无法使其工作。以下是我的插件配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadeTestJar>true</shadeTestJar>
            </configuration>
        </execution>
    </executions>
</plugin>

“...-tests.jar”文件没有条目,但主要的shaded jar看起来很好(尽管它不包含任何测试类)。
此外,这个问题与另一个问题重复,尽管接受的答案并不是真正令人满意的:如何在由maven-shade-plugin创建的Jar中包含测试类?

我也尝试了很长时间这个方法,但无法使其工作,最终我使用了汇编插件,它可以正常工作。请查看我的解决方案:https://dev59.com/4Wkv5IYBdhLWcg3w3EWl#36058365 - A_Di-Matteo

5

我通过添加以下内容使其正常工作:

<plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>build-helper-maven-plugin</artifactId>
     <version>1.9.1</version>
     <executions>

        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
               <goal>add-source</goal>
            </goals>
            <configuration>
               <sources>
                   <source>${project.basedir}/src/test/java/</source>
               </sources>
            </configuration>
        </execution>

      </executions>
</plugin>

为了使其正常工作,任何测试依赖项都需要变成非测试依赖项。 - Adam
1
这个解决方案对我有效。关于“任何测试依赖项都需要变成非测试依赖项”的评论,可以通过引入一个单独的shade配置文件来解决,其中包含所有测试类所需的依赖项。否则,你的shaded JAR将无法正常工作。 - dmaidaniuk

1
尝试像这样include您的测试包:
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>1.2.2</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <artifactSet>
          <includes>
            <include>org.apache.maven:*</include>
          </includes>
        </artifactSet>
      </configuration>
    </execution>
  </executions>
</plugin>

我认为这不会起作用,除非该包含一个包括测试代码的工件。即使如此,我也需要为我的每个依赖项添加一个包含,这是多余的。 - Patrick Marchwiak

1
使用如上所述的maven-shade-plugin是正确的,但由于一个错误,shadeTestJar无法正常工作,导致生成的测试JAR文件为空。

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