Java + Maven - 来自测试类的可执行jar

时间:2018-01-26 11:37:37

标签: java maven selenium javafx jar

我有一个多模块Selenium项目正在使用Page Factory并通过调用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()ImmutableSet<ClassPath.ClassInfo>获得ClassPath.from(loader).getTopLevelClasses()

1 个答案:

答案 0 :(得分:0)

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

因此,您有多种选择:

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

    1. 在编译时不知道独立模块的API和协议。
    2. 呃,呃......!我真诚地希望这不是你的情况,因为它不符合标准设计的良好实践。 无论如何,在Java中,您始终可以通过使用反射来调用任何对象中的任何方法。虽然我不会建议它。