编译引用类构造函数的Maven编译错误

时间:2015-01-14 15:50:38

标签: java maven compilation maven-3

我有以下设置:

  • 包含3个模块的父POM
  • 模块底部,类名为ClassA,此模块类似于底层EJB
  • 模块中间依赖于Bottom提供范围,只有此模块可以访问底部,如服务层。具有3个构造函数的ClassB类,默认(无params),String构造函数和最后一个Bottom图层类参数。
  • 模块顶部像Web层,在编译范围内依赖于中间层。这里ClassC使用带有字符串构造函数的ClassB的新Object。

在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


父POM

<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>

底层 - EJB层

<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();
    }

}

Top - WEB图层

<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");
    }

}

1 个答案:

答案 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,项目就会编译。