一、pom.xml文件
1.1 there is no POM in this directory
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/home/cys/SEtesting/example/smartut-report). Please verify you invoked Maven from the correct directory. -> [Help 1]
-1.1.1原因:此类报错,因为该目录下无pom.xml配置文件;
-1.1.2解决:前往有pom.xml的目录一级;
1.2 The file /home/xx/pom.xml is not sorted :
一般出现在改完pom.xml后:
[INFO] Verifying file /home/xx/pom.xml
[ERROR] The xml element <groupId>junit</groupId> should be placed before <groupId>net.javacrumbs.json-unit</groupId>
[ERROR] The file /home/xx/pom.xml is not sorted
-1.2.1原因: 该pom.xml 的格式被你改出了问题,问题不大,用一种排序插件[sortpom]的命令即可;
-1.2.2解决: 该目录下输入如下命令即可:[100%解决not sorted]
mvn com.github.ekryd.sortpom:sortpom-maven-plugin:3.3.0:sort -Dsort.predefinedSortOrder=custom_1
1.3 更改pom.xml后显示有几个plugin not found;
java.lang.NoClassDefFoundError
,这是因为 JVM 无法初始化 org.apache.james.backends.cassandra.DockerCassandraSingleton
类。
-1.3.1 原因
- 依赖未正确加载:所需的类或库没有正确加载到类路径中。
- 类路径问题:类或库存在于类路径中,但在运行时未正确加载。
- 类加载器问题:类加载器配置问题导致某些类无法加载。
-1.3.2 解决:
- 检查依赖是否正确加载:确保所需的依赖已经被正确添加到
pom.xml
文件中,并且已经被下载到本地仓库。- 强制更新依赖项:使用
-U
选项强制更新所有依赖项。- 检查类路径:确认类路径中是否包含了所需的类或库。
- 检查类加载器配置:确保类加载器配置正确。
尝试mvn clean install -U【报错:Could not initialize class不能初始化类】
[INFO] Running org.xx.init.xTest
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.005 s <<< FAILURE! - in org.xx.init.xTest
[ERROR] org.xx.init.xTest Time elapsed: 0.005 s <<< ERROR!
java.lang.NoClassDefFoundError: Could not initialize class
org.apache.james.backends.cassandra.DockerCassandraSingleton
1.4 pom.xml内配置的{argLine} 介绍
在 Maven 中,argline
是一个用于配置 JVM 参数的属性,它允许你在构建或运行 Maven 插件时传递参数给 Java 应用程序。
同样,对于 ${maven-plugin-annotations.version}这一类参数:
会自动到主项目的pom.xml去看设置的参数值;
二、Maven项目执行生命周期中的报错
2.1 Maven版本不够:
按其本身的英文解释就是当前版本3.6.3不行,至少需要3.8.1往上。
2.2 clean相关
2.2.1 构建前没有进行clean,会直接读取上一次构建的缓存:
2.3 Mvn compile / test-compile 报错:
2.3.1 a.java[20,21]找不到符号
如下:
[ERROR] /home/a/aTest.java:[51,18] 找不到符号
符号: 类 TestId
位置: 类 org.a.aTest
2.3.1.1 原因 :pom.xml缺少
相应的依赖
mvn test 依赖于 mvn compile 的结果; mvn compile 没有成功执行,从而导致 “找不到符号” 错.
2.3.1.2 解决:
确认所需的依赖是否已经被正确添加到 pom.xml
文件中,并且是否已经被正确下载到本地仓库。
即修改pom.xml-->mvn clean install. 再进行compile;
2.3.2 b.java:[33,1] 仅从类和接口静态导入
2.3.2.1 原因 :
第 33 行存在一个非静态导入,而你只允许从类和接口进行静态导入。这通常是因为你在导入某个类或接口时,错误地导入了一个非静态成员。
2.3.2.2 解决:
检查导入语句:
确认你的导入语句是否正确。如果是非静态成员,则需要改为静态导入。修改导入语句:
如果你需要导入的是一个类或接口中的静态成员,则应该使用static
关键字进行导入。
2.3.3 c.java:[38,56] 程序包a1.a2.ax不存在
2.3.3.1 原因 :mvn test 依赖于 mvn compile 的结果;
如果 mvn compile 没有成功执行,测试代码编译所需的主代码将不可用,从而导致 “找不到符号” 错
2.3.3.2 解决:
2.3.4 d.java:[98,9] 方法不会覆盖或实现超类型的方法
2.3.4.1 原因 :
意味着在子类中定义了一个方法,但该方法并没有正确地覆盖(override)或实现(implement)其超类(父类)或接口中的相应方法。
方法签名不同:
方法名、返回类型、参数列表必须完全一致。访问修饰符不匹配:
覆盖的方法必须具有至少与超类方法相同或更宽松的访问级别。例如,如果超类方法是public
的,那么子类覆盖的方法也必须是public
的。未正确标注
使用@Override
注解:@Override
注解可以确保方法确实覆盖了超类的方法。如果没有正确使用注解,IDE 可能不会提示错误。
2.3.4.2 解决:
检查方法签名:
确保方法名、返回类型、参数列表与超类的方法完全一致。检查访问修饰符:
确保访问修饰符至少与超类方法相同或更宽松。使用
使用@Override
注解:@Override
注解可以确保方法确实覆盖了超类的方法。
2.4 install相关
2.4.1报错解决---科学上网
但是这个报错也没必要解决,如果只是对部分模块进行测试的话;
[ERROR] I/O error for image [registry-1.docker.io/library/eclipse-temurin]:
[ERROR] Connect to production.cloudflare.docker.com:443 [production.cloudflare.docker.com/199.16.156.11, production.cloudflare.docker.com/2a03:2880:f102:183:face:b00c:0:25de] failed: 网络不可达
(connect failed)
2.4.2 install时: Could not resolve dependencies xx 无法解析依赖;
[ERROR] Failed to execute goal on project abc: Could not resolve dependencies for project org.apache.x:abc:jar:3.7.6-SNAPSHOT:
https://repository.apache.org/snapshots was cached in the local repository, resolution will not be reattempted until the update interval of apache.snapshots has elapsed or updates are forced -> [Help 3]
2.4.2.1 原因
原因在于 Maven 试图从远程仓库 https://repository.apache.org/snapshots
下载依赖项,但由于某种原因未能成功,导致 Maven 从本地仓库缓存中读取,而不是重新尝试解析。
2.4.2.2 解决
- 清理本地仓库缓存:确保本地仓库中没有错误的缓存。
- 强制更新依赖项:使用
-U
选项强制更新所有依赖项。- 检查依赖版本:确保依赖版本正确并在远程仓库中可用。
- 更新远程仓库配置:确保远程仓库配置正确且可访问。
- 检查远程仓库状态:手动检查远程仓库的状态。
- 手动下载依赖项:如果远程仓库暂时不可用,可以手动下载依赖项并安装到本地仓库。
1)强制重新更新:
mvn clean install -U
2)更新远程仓库地址
可能 远程仓库的地址有问题 / 远程仓库暂时不可用 --- 可以尝试更新远程仓库的地址。
3)检查依赖版本
确保你的项目中定义的依赖版本正确且在远程仓库中可用。
如果依赖项的版本是 SNAPSHOT
,则需要确保远程仓库支持 SNAPSHOT
版本的更新
假设你的 pom.xml
文件中包含了对 abc
的依赖:
<dependencies>
<dependency>
<groupId>org.apache.x</groupId>
<artifactId>abc</artifactId>
<version>3.7.6-SNAPSHOT</version>
</dependency>
<!-- 其他依赖 -->
</dependencies>
3)-a 检查远程仓库状态
如果你怀疑远程仓库的状态有问题,可以尝试手动访问仓库地址:
curl https://repository.apache.org/snapshots/org/apache/x/abc/3.7.6-SNAPSHOT/
如果返回的是仓库的索引文件,说明仓库是可访问的;
如果返回错误信息,则可能是远程仓库暂时不可用。
3)-b 使用 SNAPSHOT 版本
对于 SNAPSHOT
版本的依赖,需要确保远程仓库支持自动更新。你可以通过以下方式配置:
-
在
pom.xml
中配置:<repositories> <repository> <id>apache.snapshots</id> <name>Apache Snapshot Repository</name> <url>https://repository.apache.org/snapshots</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </snapshots> </repository> </repositories>
-
在全局
settings.xml
中配置:<servers> <server> <id>apache.snapshots</id> <username>your_username</username> <password>your_password</password> </server> </servers>
3)-c 手动下载依赖项
如果远程仓库暂时不可用,可以尝试手动下载依赖项并放置在本地仓库中:
-
下载依赖项:
你可以手动下载
.jar
文件和对应的.pom
文件,并放置在本地仓库中。 -
安装依赖项:
使用 Maven 安装插件手动安装依赖项:
mvn install:install-file \ -Dfile=path/to/dependency.jar \ -DpomFile=path/to/pom.xml \ -DgroupId=org.apache.x \ -DartifactId=abc \ -Dversion=3.7.6-SNAPSHOT \ -Dpackaging=jar
2.4.3 依赖有问题可以尝试 mvn clean install -U
【-U 选项用于强制 Maven 更新所有的快照依赖(SNAPSHOT dependencies)。通常【即不加-U】,Maven 会使用本地缓存的旧快照版本】
三、运行smartut 工具 的 Q&A:
3.1
-Q: -class 后面写 target.classes.demo.A ----为什么这样写类不行?
-A: class后跟的应该是“包.类”, 这个example. target不属于包名, 只能说是路径example/target
Demo才是包。Demo.A才是其中的类;
3.2 Java -jar ./smartut.jar -h查看命令使用帮助
SmartUt 的命令行选项有助于设置和运行测试生成。以下是主要选项的解释:
-base_dir <arg>: 设置工作目录,测试和报告将保存在此目录中;
-class <arg>: 指定要生成测试的目标类,需提供完整的类名(如 org.foo.SomeClass);
-client_remote_debug <arg> 和 -master_remote_debug <arg>: 用于客户端和主进程的远程调试;
-continuous <arg>: 运行连续测试生成,参数可以是 EXECUTE, INFO, CLEAN。
-criterion <arg>: 指定测试生成的目标标准,可以用冒号分隔列出多个标准。
-D <property=value>: 设置系统属性。
-generateMOSuite, -generateRandom, -generateSuite, -generateSuiteUsingDSE, -generateTests: 指定不同的测试生成方法。
-heapdump: 当客户端 VM 发生内存溢出错误时创建堆转储。
-inheritanceTree: 在设置过程中缓存继承树。
-junit <arg>: 设置 JUnit 的前缀。
-libraryPath <arg>: 设置项目测试的本地库路径。
-listClasses: 列出指定类路径/前缀中的可测试类。
-listParameters: 列出可以用 -D 设置的所有参数。
-measureCoverage: 测量现有测试用例的覆盖率。
-mem <arg>: 设置客户端进程的堆大小(以 MB 为单位)。
-parallel <n i x>: 启动并行运行,n 是客户端数,i 是迭代频率,x 是通信率。
-prefix <arg>: 设置目标包前缀,用于测试生成。
-printStats: 打印类信息和可覆盖的目标。
-projectCP <arg>: 设置项目及其依赖项的类路径。
-seed <arg>: 设置随机数生成器的种子。
-setup <arg>: 使用属性文件创建 smartut 文件。
-smartutCP <arg>: 设置 SmartUt jar 文件的类路径。
-startedByCtg: 确定当前进程是否由 CTG 进程启动。
-target <arg>: 设置目标类路径,指定 jar 文件或包含 .class 文件的文件夹。
-writeDependencies <arg>: 将目标类的依赖项写入文件。