我在测试和部署过程中遇到了一个关于 Maven 的奇怪问题。
项目结构
src/main/java/com/../models/Employee.java
src/test/java/com/../models/EmployeeTest.java
员工
public class Employee {
private final String name;
private final Dollars salary;
public Employee(String name, Dollars salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public Dollars getSalary() {
return this.salary;
}
}
美元
public class Dollars {
private final BigDecimal value;
public Dollars(BigDecimal value) {
this.value = value;
}
public BigDecimal getValue() {
return value;
}
}
员工测试
public class EmployeeTest {
@Test
public void justASimpleTest() {
Employee employee = new Employee("David", new Dollars(BigDecimal.valueOf(100)));
Employee updatedEmployee = updateSalary(BigDecimal.valueOf(200)).apply(employee);
assertEquals(BigDecimal.valueOf(200), updatedEmployee.getSalary().getValue());
}
private Function<Employee, Employee> updateSalary(final BigDecimal value) {
return employee -> new Employee(employee.getName(), new Dollars(value));
}
}
问题
当我运行“测试”、“验证”或“安装”时,出现以下错误:
cannot find symbol: class Employee
仅在函数中!
private Function<Employee, Employee> updateSalary(final BigDecimal value) {...}
^^^^^^^^ ^^^^^^^^
但是 intelliJ 确实可以解析引用,我没有 IntelliJ 提供的错误,而且通过 maven 构建并使用在 IntelliJ 中运行的 JUnit 进行测试!
经过一番尝试,我注意到当打包设置为jar时会出现此问题,并且<packaging>pom</packaging>
一切正常。
尽管通过 cmd 使用“mvn clean install”、通过 IntelliJ 内的 Maven 和 CI/CD(teamcity) 上的 Maven,此问题仍然存在
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<groupId>XXX</groupId>
<artifactId>YYY</artifactId>
<version>ZZZ</version>
<artifactId>sample</artifactId>
<properties>
<junit.version>4.11</junit.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<proc>only</proc>
<generatedSourcesDirectory>${project.build.directory}/generated-sources/annotations
</generatedSourcesDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
有人可以解释一下为什么会发生这种情况吗? 谢谢:)
最佳答案
我发现问题了!
使用<packaging>pom</packaging>
测试被跳过,这就是它有效的原因,但这不是解决方案!
问题是我正在使用 <proc>only</proc>
。当此属性具有“only”值时,意味着仅执行注释过程,不进行编译。这解释了为什么在安装阶段找不到 Employee
类。
有关proc
的更多详细信息配置HERE
关于java - Maven 无法解析类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481775/