在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”文件夹(或任何其他文件夹)。
这些是我安装的版本:
答案 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正在悄悄地在幕后补偿这一点。