【问题标题】:M2Eclipse & workspace projectM2Eclipse & 工作区项目
【发布时间】:2011-05-10 12:08:39
【问题描述】:

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

在两个项目上都设置了“解决工作区项目中的依赖项”标志。这在编译时工作得很好,即编译器在“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(内部版本 ID:20110301-1815)
  • m2eclipse: 0.12.1 (build id: 20110112-1712)

【问题讨论】:

  • 你如何运行你的应用程序?通过 Maven?
  • 我让 Eclipse 使用“运行配置”启动应用程序。此“运行配置”的类路径包括“Maven 依赖项”条目。我使用的任何第三方库都包含在此条目中,但不包含项目依赖项。最重要的是,当我运行一个测试类时,“ProjectA/target/test-classes”包括...

标签: eclipse maven m2eclipse workspace


【解决方案1】:

我终于在我的配置中发现了错误。它与工作空间依赖项中的“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>

如果我删除“分类器”子项,m2eclipse 的工作区依赖解析就像一个魅力。

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

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

【讨论】:

    【解决方案2】:

    请记住,Maven 使用本地存储库来共享 JAR。如果您还没有安装 (mvn install) 模块 A,那么模块 B(依赖于模块 A)将不会意识到它。 IDE 在幕后悄悄地对此进行补偿。

    【讨论】:

    • “解决工作区依赖关系”标志在编译时会处理这个问题,但在运行时不会?这没有意义。此外,它在使用“mvn eclipse:eclipse”而不是 m2eclipse 时有效。你怎么解释?
    • @Wim 当您运行项目时,您是调用内部 Eclipse 管理的 Maven 还是调用外部 (CLI) 版本?
    • @Gary:我正在使用内置的 Maven。
    • @Wim 最终检查 - 如果您在模块 A 上运行 mvn install,然后立即重复执行模块 B 是否有效?
    • @Gary:当我安装 ProjectA 的 JAR 工件并禁用工作区解析时,ProjectB 运行成功。 (我之前想通了,但我真的不想为我的实时环境安装每个依赖项......)
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 2016-04-15
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多