【问题标题】:Building single fat jar from a multi module maven project - including test classes从多模块 maven 项目构建单个 fat jar - 包括测试类
【发布时间】:2017-02-11 20:27:33
【问题描述】:

我处于需要从多模块 maven 项目构建一个胖 jar 的情况。该项目基于 Selenium/cucumber API 构建。

我的项目结构如下

   Parent -- pom
   |
   |__core_module src/main/java --> helper classes for selenium
   |
   |__acme_module src/main/test --> Test Classes for acme project

我尝试了不同的方法来构建一个“acme_test.jar”,其中包括 core_module+acme_module。但是它们都没有帮助我。

非常感谢任何解决此问题的线索。

谢谢

【问题讨论】:

  • 真的不清楚你想在这里做什么。 acme_test.jar 是什么,acme_module 是什么以及其余的,它们究竟包含什么,它们之间有什么关系...?
  • 这一切都即将为硒测试用例构建一个辅助框架,比如说,对于 acme。 core_module 将保存 selenium 的所有帮助程序和实用程序类,而 acme_module 将保存“acme”的测试类。我们正在尝试从这两个模块(具有所有依赖项)构建一个胖 jar(可执行文件 - core_module+acme_module = acme_fat_test.jar)到一个不太懂技术的客户端,以避免相关设置。
  • 你的意思是src/test/java?这是src/main/test 正确吗?
  • @kallada :很抱歉,但您的解释并没有更清楚。您的目标是最终拥有一个可执行的 jar,以便在您要执行它时运行测试?

标签: maven selenium testing


【解决方案1】:

正如@MariuszS 所提到的,首先重组您的项目,以便为测试Acme(=驱动/验证导航)的实际类分离任何单元测试或集成测试。

   Parent -- pom
   |
   |__core_module src/main/java --> helper classes for selenium
   |
   |__acme_module src/main/java --> Classes specific for navigating acme 
   |
   |__acme_module src/test/java--> (Unit etc) Test Classes for acme project

然后,您需要 acme_module 包含 core_module 作为依赖项。

最后,在 acme_module 中,将其放入您的构建插件部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <executions>
        <execution>
            <id>create-fat-jar</id>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                <!-- add Main-Class to manifest file -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>your.main.class</mainClass>
                    </transformer>
                </transformers>
                    <finalName>YourJarName</finalName>
            </configuration>
        </execution>
    </executions>
</plugin>

您还可以通过在插件配置部分添加包含过滤器来显式包含 core_module

【讨论】:

  • 当然核心模块也应该在core_module/src/test/java下进行测试。
  • 或者,如果您不希望您的模块在阴影 jar 中解压,您可以使用onejar-maven-plugin 来创建嵌套 JAR 的 uber JAR,即有一个特殊的类加载器加载未更改的 JAR直接来自 uber JAR。也可通过this fork 在 Maven Central 上获得。如果您 (kallada) 想了解更多信息并且我有机会接受它作为答案,请告诉我,我会准备一份。但是 Maven Shade 也可以完成这项工作,这个答案是正确的。
  • 抱歉,由于个人原因无法及时回复各位。
【解决方案2】:

acme_module 配置为胖模块 - 该模块应生成具有所有依赖项的可执行胖 jar。

core_module 添加到acme_module 作为依赖项。

将您的测试类从src/test/java 移动到src/main/java,因为这个类应该是可执行的。如果您有测试(如 junit),则将这些类留在 test 目录中,但可执行部分应保留在 main 中。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2014-03-03
    • 2011-02-11
    • 2012-02-02
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多