【问题标题】:Java + Maven - executable jar from test classJava + Maven - 来自测试类的可执行 jar
【发布时间】:2018-07-05 18:00:31
【问题描述】:

我有一个多模块 Selenium 项目,它使用页面工厂并通过调用 mvn clean verify... 来通过套件运行测试

我创建了一个 JavaFX 应用程序,它加载所有套件并让用户选择一个测试,然后由上述命令运行。

我现在面临的问题是,为了加载所有测试类(我在模块依赖项中使用 test-jar,以便我在 app 模块中的测试类可以看到其他模块中的测试) ,我需要在测试类中拥有main 方法,而不是在主类中。 显然,这是行不通的,因为测试类不包含在 jar 中。

我正在寻找解决方案,要么在测试类中使用该 main 方法,要么让 src/main 查看 src/test。

人们一直给出的建议之一是为测试设置一个单独的模块。这对我来说不是一个选择,因为我无权移动测试类或更改项目结构。

这是我正在使用的插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <mainClass>com.package.myapp.Main</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <appendAssemblyId>false</appendAssemblyId>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

为了加载套件,我使用 ClassLoader loader = Thread.currentThread().getContextClassLoader()ClassPath.from(loader).getTopLevelClasses() 获取 ImmutableSet&lt;ClassPath.ClassInfo&gt;

【问题讨论】:

  • 什么你需要进入测试类的 main 方法?
  • 应用程序的入口点:public static void main(String[] args)。如果我将它移到 src/main 它看不到其他模块的测试类。如果我将它移动到 src/test 我没有工作的可执行 jar

标签: java maven selenium javafx jar


【解决方案1】:

这是一个关于解耦模块的标准问题:你有两个模块:依赖模块和独立模块。您需要从 Dependent 调用 Independent,但不要在 Dependent 的编译中包含 Independent。

因此,您有多种选择:

  1. 当独立模块的 API 和协议在编译时已知时。 在这种情况下,您应该设计一个接口来为每个独立 API 建模。将这些接口发布到一个单独的库中,并将独立库重新扩展到这些接口。还提供一个工厂,它通过一组类名的动态实例化(在运行时接收)返回这些接口的对象。

在Dependent模块中,你只需调用工厂获取每个接口实现并使用即可。

  1. 当独立模块的 API 和协议在编译时未知时。

呃,呃……!我真诚地希望这不是你的情况,因为它不符合标准设计的良好实践。 无论如何,在 Java 中,您始终可以通过使用 reflection 调用任何对象中的任何方法。虽然我不会建议。

【讨论】:

  • 感谢您的澄清,我认为这并不简单。我决定将它全部移动到 src/main 并使用文件系统来获取我的套件:)
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2014-01-26
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多