You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块Selenium项目:JavaFX应用加载测试类的Maven打包问题

针对你的Selenium+JavaFX项目打包问题的解决方案

结合你提到的不能调整项目结构、不能移动测试类的约束,我整理了两个直接可行的方案:


方案一:将测试类打包进可执行Jar,保留测试类中的主方法

既然你不想移动主方法,那可以修改maven-assembly-plugin的配置,直接把编译后的测试类也打包到最终的可执行Jar里,同时指定测试类作为主类。

修改你的assembly插件配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <!-- 替换成你测试类中带main方法的全类名 -->
                <mainClass>com.package.myapp.YourTestMainClass</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <appendAssemblyId>false</appendAssemblyId>
        <!-- 添加这部分:把测试类目录的class文件打包进去 -->
        <fileSets>
            <fileSet>
                <directory>${project.build.testOutputDirectory}</directory>
                <outputDirectory>/</outputDirectory>
                <includes>
                    <include>**/*.class</include>
                </includes>
            </fileSet>
        </fileSets>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

关键说明:

  • ${project.build.testOutputDirectory}是Maven默认的测试类编译输出目录(一般是target/test-classes),通过fileSet把这个目录下的所有class文件打包到Jar根目录,和主类的class放在一起。
  • 打包时Maven的package阶段会自动先执行test-compile,测试类会提前编译好,不用担心找不到类的问题。
  • 执行mvn clean package生成Jar后,直接运行java -jar your-app.jar就能启动测试类中的主方法,同时能加载所有测试类。

方案二:把主方法移到src/main,让主代码访问测试类

如果更倾向于主方法放在正式代码目录,那可以通过依赖自身和其他模块的test-jar,让src/main的代码能访问src/test的测试类。

步骤1:确保所有模块都生成test-jar

在每个包含测试类的模块的pom.xml中,给maven-jar-plugin添加生成test-jar的配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <executions>
        <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

步骤2:在JavaFX应用模块的pom中添加test-jar依赖

在应用模块的<dependencies>里,添加自身和其他模块的test-jar依赖,设置scope为compile,这样主代码就能访问测试类:

<dependencies>
    <!-- 依赖自身的test-jar -->
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>${project.artifactId}</artifactId>
        <version>${project.version}</version>
        <classifier>tests</classifier>
        <scope>compile</scope>
    </dependency>
    <!-- 添加其他模块的test-jar依赖,示例: -->
    <dependency>
        <groupId>com.package</groupId>
        <artifactId>your-selenium-module</artifactId>
        <version>1.0.0</version>
        <classifier>tests</classifier>
        <scope>compile</scope>
    </dependency>
</dependencies>

步骤3:调整主类和打包配置

把主方法移到src/main/java下的com.package.myapp.Main类中,保持你原来的maven-assembly-plugin配置不变(主类指向这个新的Main类)。

执行mvn clean package生成的Jar就能正常启动,并且主代码可以通过ClassLoader加载所有测试类。


额外提示

不管用哪个方案,你原来的ClassPath.from(loader).getTopLevelClasses()逻辑都不需要修改,因为打包后测试类已经在类路径里了,getContextClassLoader能正常扫描到。

内容的提问来源于stack exchange,提问作者StopTheRain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:32:48