我有以下设置:
在eclipse中所有编译都OK,但在命令行Maven中抛出错误。 我从父POM执行命令 mvn clean compile 并得到以下错误:
class file for com.test.bottom.ClassA not found
这个错误与模块Top,web层有关,通过引用ClassA这是一种Bottom模块。模块Top,类ClassC,没有依赖范围或对Module,类ClassA的任何引用。 任何参数构造函数都存在错误。 我想要一次运行解决一个解决方案,也许是编译选项。
请告诉我任何建议。感谢
这里是解释代码。 Google Drive file
<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>
<groupId>com.test</groupId>
<artifactId>test-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.source.version>1.6</java.source.version>
<java.target.version>1.6</java.target.version>
</properties>
<modules>
<module>test-bottom</module>
<module>test-middle</module>
<module>test-top</module>
</modules>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<inherited>true</inherited>
<version>3.1</version>
<configuration>
<source>${java.source.version}</source>
<target>${java.target.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
<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>
<parent>
<groupId>com.test</groupId>
<artifactId>test-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>test-bottom</artifactId>
</project>
package com.test.bottom;
public class ClassA {
public ClassA() {
}
}
<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>
<parent>
<groupId>com.test</groupId>
<artifactId>test-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>test-middle</artifactId>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-bottom</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
package com.test.middle;
import com.test.bottom.ClassA;
public class ClassB {
public ClassB() {
super();
}
public ClassB(String str){
}
public ClassB(ClassA a) {
super();
}
}
<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>
<parent>
<groupId>com.test</groupId>
<artifactId>test-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>test-top</artifactId>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-middle</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
package com.test.top;
import com.test.middle.ClassB;
public class ClassC {
public ClassC() {
new ClassB("a");
}
}
答案 0 :(得分:1)
从Maven页面,依赖机制简介,Dependency Scope section:
- 的提供强> 这很像编译,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅适用于编译和测试类路径,且不具有传递性。
因此,范围设置为提供的的依赖项不可传递。在您的问题的上下文中,这意味着测试顶层模块的类将无法查看属于测试底层模块的任何类(即ClassA
类,这是ClassB
类的参数'构造函数)。
如果您想从ClassB
类引用ClassC
,那么您需要将test-bottom设置为test-top pom.xml
中提供的依赖项:
<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>
<parent>
<groupId>com.test</groupId>
<artifactId>test-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>test-top</artifactId>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-middle</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-bottom</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
这样,ClassC
的{em>可见性超过了ClassA
,项目就会编译。