自学内容网 自学内容网

Maven项目常见各类 Q&A

一、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. 依赖未正确加载:所需的类或库没有正确加载到类路径中。
  2. 类路径问题:类或库存在于类路径中,但在运行时未正确加载。
  3. 类加载器问题:类加载器配置问题导致某些类无法加载。

-1.3.2 解决:

  1. 检查依赖是否正确加载:确保所需的依赖已经被正确添加到 pom.xml 文件中,并且已经被下载到本地仓库。
  2. 强制更新依赖项:使用 -U 选项强制更新所有依赖项。
  3. 检查类路径:确认类路径中是否包含了所需的类或库。
  4. 检查类加载器配置:确保类加载器配置正确。

 尝试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  解决:
  1. 检查导入语句

      确认你的导入语句是否正确。如果是非静态成员,则需要改为静态导入。
  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)其超类(父类)或接口中的相应方法。

  1. 方法签名不同

      方法名、返回类型、参数列表必须完全一致。
  2. 访问修饰符不匹配

      覆盖的方法必须具有至少与超类方法相同或更宽松的访问级别。例如,如果超类方法是 public 的,那么子类覆盖的方法也必须是 public 的。
  3. 未正确标注 @Override 注解

      使用 @Override 注解可以确保方法确实覆盖了超类的方法。如果没有正确使用注解,IDE 可能不会提示错误。

2.3.4.2  解决:

  1. 检查方法签名

      确保方法名、返回类型、参数列表与超类的方法完全一致。
  2. 检查访问修饰符

      确保访问修饰符至少与超类方法相同或更宽松。
  3. 使用 @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 解决
  1. 清理本地仓库缓存:确保本地仓库中没有错误的缓存。
  2. 强制更新依赖项:使用 -U 选项强制更新所有依赖项。
  3. 检查依赖版本:确保依赖版本正确并在远程仓库中可用。
  4. 更新远程仓库配置:确保远程仓库配置正确且可访问。
  5. 检查远程仓库状态:手动检查远程仓库的状态。
  6. 手动下载依赖项:如果远程仓库暂时不可用,可以手动下载依赖项并安装到本地仓库。
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 版本的依赖,需要确保远程仓库支持自动更新。你可以通过以下方式配置:

  1. 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>
  2. 在全局 settings.xml 中配置

    <servers>
        <server>
            <id>apache.snapshots</id>
            <username>your_username</username>
            <password>your_password</password>
        </server>
    </servers>
3)-c 手动下载依赖项

如果远程仓库暂时不可用,可以尝试手动下载依赖项并放置在本地仓库中:

  1. 下载依赖项

    你可以手动下载 .jar 文件和对应的 .pom 文件,并放置在本地仓库中。

  2. 安装依赖项

    使用 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>: 将目标类的依赖项写入文件。


原文地址:https://blog.csdn.net/weixin_70874886/article/details/142032698

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!