Maven Eclipse Java错误类型的层次结构......不一致

时间:2013-10-31 14:42:31

标签: java eclipse maven

我看过看起来很相似的帖子,但我还没有发现任何导致解决方案的帖子。

我正在使用Windows 7上的Eclipse Juno进行编辑。

我从项目目录中的命令行运行maven clean install war:inplace,其中包含两个构建错误。 注意:Maven成功构建ProjectB

我非常确定这两条错误消息都是直接相关的。

错误

    {li} The hierarchy of the type SomeClassB is inconsistent错误SomeClassB
  1. The type javax.servlet.Servlet cannot be resolved. It is indirectly referenced from required .class files SomeClassC
  2. 导入后的类声明行中的以下代码中出现两个错误:

    import foo.bar.one.a.base.SomeClassA;
    import foo.bar.two.b.property.PropertyX;
    
    public abstract class SomeClassB extends SomeClassC{
    
        public SomeClassB() {
            super();
        }
    
        @Override
        protected PropertyX getPropertyX() {
            return SomeClassA.getPropertyX(this.getPropName());
        }
    
        @Override
        protected String getPropName() {
            return SomeClassA.PROPERTY_NAME;
        }
    
    }
    

    有些注意事项:

    1. SomeClassC在另一个项目中定义。我会称之为ProjectC
    2. 上面的代码来自ProjectBProjectB 的pom.xml文件包含对ProjectC的引用。见下面的代码:
    3. 的pom.xml

      编辑:添加了所有依赖项

      <dependencies>
          <dependency>
              <groupId>com.ibm.ws</groupId>
              <artifactId>j2ee</artifactId>
              <version>7.0.0.5</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>com.ibm.wps</groupId>
              <artifactId>com.ibm.ws.portletcontainer</artifactId>
              <version>6.1.0.2</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>com.ibm.icu</groupId>
              <artifactId>icu4j</artifactId>
              <version>3.4.1</version>
          </dependency>
          <dependency>
              <groupId>com.ibm.jsf</groupId>
              <artifactId>jsf</artifactId>
              <version>3.0.7</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>com.ibm.jsf</groupId>
              <artifactId>jsf-impl-messages</artifactId>
              <version>7.0.0.5</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>com.ibm.jsf</groupId>
              <artifactId>jsf-portletbridge</artifactId>
              <version>3.1.5</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>com.ibm.jsf</groupId>
              <artifactId>jsf-ibm</artifactId>
              <version>3.0.11</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>log4j</groupId>
              <artifactId>log4j</artifactId>
              <version>1.2.14</version>
          </dependency>
          <dependency>
              <groupId>foo.bar.one.c</groupId>
              <artifactId>foo1</artifactId>
              <version>1.2.3</version>
              <scope>provided</scope>
              <type>jar</type>
          </dependency>
          <dependency>
              <groupId>foo.bar.one.c</groupId>
              <artifactId>foo2</artifactId>
              <version>${foovar2.version}</version>
          </dependency>
          <dependency>
              <groupId>foo.bar.one.c</groupId>
              <artifactId>PropertyX</artifactId>
              <version>${property.version}</version>
          </dependency>
          <dependency>
              <groupId>foo.bar.one.c</groupId>
              <artifactId>ProjectC</artifactId>
              <version>${varname.version}</version>
          </dependency>
          <dependency>
              <groupId>foo.bar.one.c</groupId>
              <artifactId>foo3</artifactId>
              <version>${foovar3.version}</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>foo.bar.one.c</groupId>
              <artifactId>foo4</artifactId>
              <version>${foovar4.version}</version>
              <scope>provided</scope>
          </dependency>
          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>servlet-api</artifactId>
              <version>2.5</version>
              <scope>provided</scope>
          </dependency>
      </dependencies>
          <properties>
              ...
              <varname.version>5.2.85373</varname.version>
              ...
          </properties>
      

      我确保ProjectC和类确实存在于我的文件系统中,并且它的路径是ProjectB的.classpath文件中的一个条目。

      我尝试过的解决方法是将ProjectC导入eclipse并将其添加到ProjectB的Java Build Path中。我不想这样做,因为这对我的团队来说是一种沮丧的做法。

      我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

提供此依赖关系

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

答案 1 :(得分:0)

当您从命令行运行Maven时会发生这种情况。

简而言之,Eclipse认为只会自己更改target/classes/下的文件。如果从命令行运行Maven,它将更改相同的文件,Eclipse将会非常困惑。

您有两种选择:

  1. 使用项目 - &gt;清洁再次构建一切。

  2. Configure Eclipse to use a different output folder用于构建而不是命令行中的Maven。