M2Eclipse&工作区项目

时间:2011-05-10 12:08:40

标签: eclipse maven m2eclipse workspace

在Eclipse Helios中,m2eclipse插件在任何运行配置中都不包含本地工作空间中的项目。

我已经设置了这个测试场景:

ProjectA
+ src/main/java/a/TestInA.java
+ pom.xml

ProjectB
+ src/main/java/b/TestInB.java ("main()" calls "a.TestInA.main()")
+ pom.xml (includes reference to ProjectA)

在两个项目上都设置了“从Workspace项目中解析依赖项”标志。这在编译时可以很好地工作,即编译器在“b.TestInB”中找到对“a.TestInA”的引用,而“Maven依赖”列表包括对“ProjectA”的引用。但是当我尝试实际运行“b.TestInB”时,我得到一个NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: a/TestInA
at b.TestInB.main(TestInB.java:13)
Caused by: java.lang.ClassNotFoundException: a.TestInA
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 1 more

实际上,系统属性“java.class.path”不包含ProjectA的“target / classes”文件夹(或任何其他文件夹)。

这些是我安装的版本:

  • Eclipse:Helios Service Release 2(内部版本号:20110301-1815)
  • m2eclipse:0.12.1(build id:20110112-1712)

2 个答案:

答案 0 :(得分:3)

我终于在配置中发现了错误。它与工作区依赖项中的“archiverClassifier”有关。我的POM被设置为根据正在运行的编译器生成不同命名的工件。

使用“jdk1.5”和“jdk1.6”的配置文件完成此操作,设置“archiverClassifier”变量:

<profiles>
    <profile>
        <id>jdk1.5</id>
        <activation>
            <jdk>1.5</jdk>
        </activation>
        <properties>
            <compilerTarget>1.5</compilerTarget>
            <archiverClassifier>jdk1.5</archiverClassifier>
        </properties>
    </profile>
    <profile>
        <id>jdk1.6</id>
        <activation>
            <jdk>1.6</jdk>
        </activation>
        <properties>
            <compilerTarget>1.6</compilerTarget>
            <archiverClassifier>jdk1.6</archiverClassifier>
        </properties>
    </profile>
</profiles>

然后,在依赖项中,我使用“classifier”子节点引用正确的分类器,为其提供先前在相应配置文件中设置的“archiverClassifier”变量:

<dependencies>
    <dependency>
        <groupId>com.brain2</groupId>
        <artifactId>ProjectA</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <classifier>${archiverClassifier}</classifier>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
</dependencies>

如果删除“classifier”子节点,m2eclipse的工作区依赖项解析就像魅力一样。

一旦我弄清楚这一点,快速谷歌搜索“m2eclipse工作空间分辨率分类器”让我在Sonatype的JIRA页面上找到了bug MNGECLIPSE-680。所以我想这是一个错误,我只是回答了我自己的问题:)

(另外注意,单元测试不会出现此问题,其中依赖项的“test-classes”目录已正确添加到类路径中。)

答案 1 :(得分:0)

请记住,Maven使用本地存储库来共享JAR。如果您尚未安装(mvn install)模块A,那么模块B(依赖于模块A)将不会意识到它。 IDE正在悄悄地在幕后补偿这一点。