【问题标题】:Use the eclipse compiler in a maven component在 Maven 组件中使用 Eclipse 编译器
【发布时间】:2011-06-27 16:29:55
【问题描述】:

我正在开发一个相当大的 Maven 项目,并使用 Eclipse 使用 Java 进行开发。

为了节省编译时间,我希望 Maven 和 Eclipse 共享 同样的目标,我设法做到了。但是,当我编译时 Maven,Eclipse 缺少一些放在字节码中的东西,所以它 重新编译所有内容(据我了解)。我在这里谈论的是“自动构建”功能,所以并不是 Eclipse 将构建委托给 Maven。

为了解决这个问题,我想我会要求 Maven 使用与 Eclipse 相同的编译器。 在网上搜索了一下,我发现我可以在顶部添加这个pom

<build>
...
<plugins>
...
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
           <compilerId>eclipse</compilerId>
           <source>1.5</source>
           <target>1.5</target>
           <optimize>true</optimize>
   </configuration>
   <dependencies>
           <dependency>
                   <groupId>org.codehaus.plexus</groupId>
                   <artifactId>plexus-compiler-eclipse</artifactId>
                   <version>1.8.1</version>
           </dependency>
   </dependencies>
</plugin>
</plugins>
</build>

这似乎可行,但构建失败很快,有很多 错误,而它使用 javac 成功。 我不知道为什么,但似乎有一些冲突与 事实上,失败的 Java 文件是生成的文件。

所以我想我可以尝试仅将 Eclipse 编译器用于 我正在处理的组件(没有那种生成的 文件)。我在组件的pom 中添加了上面的 sn-p,但是当 构建到达我的组件,引发以下错误:

没有这样的编译器'eclipse'

我还尝试在 顶部 pom 中列出的依赖项,但同样的错误。

你知道我想要做的事情是否可行吗?有什么提示我该怎么做吗?

【问题讨论】:

    标签: java eclipse maven eclipse-jdt


    【解决方案1】:

    这是一个与 Maven 多模块项目相关的旧问题: http://jira.codehaus.org/browse/MCOMPILER-165

    【讨论】:

    • 谢谢,是的,这似乎解释了为什么我不能用 Eclipse 编译器只构建一个模块。但是,与报告的问题不同,我不需要为不同的模块使用不同的编译器,所以我应该能够编译整个项目。不幸的是,我离开这个项目已经有一段时间了,无法再调查了。
    【解决方案2】:

    我猜你的问题是由于 eclipse 项目和 maven pom 不同步引起的。我建议您使用m2eclipse plugin 来保持 Maven 和 Eclipse 同步。这将使用 POM 作为“主”配置来配置您的 Eclipse 项目。

    我认为您不需要专门配置要使用的编译器,但您应该像已经在做的那样配置 maven-compiler-plugin。

    【讨论】:

    • 我实际上已经在使用 m2eclipse。 eclipse 项目是由 eclipse 从 pom 文件生成的。也许我应该提一下:当我说“ecrise 重建一切”时,我说的是 eclipse 的“自动构建”功能。我需要它来做热插拔。
    【解决方案3】:

    确保您使用最新版本的 maven-compiler-plugin(现在是 2.3.2,see this page - 它是“全名”或右上角的小版本信息)。

    除此之外,配置应该可以工作。您也可以尝试使用最新的 1.8.4 版本的 plexus-compiler-eclipse

    除此之外,您需要了解 Maven 有几种类型的依赖项。在您的情况下,有两个很有趣:构建时和插件依赖项。

    前者收集在dependencies element中,而后者必须在pluginManagement element中。在构建时类路径中添加插件不会产生您想要的效果。

    【讨论】:

      【解决方案4】:

      我不能 100% 确定您要在这里实现什么,但这听起来是个坏主意。首先,您应该将 Eclipse 配置为在您的系统上使用 SDK,而 Maven 应该使用相同的东西。所以我不明白为什么你认为 Eclipse 会在字节码中添加一些东西,而 Maven 不会被赋予它们无论如何都使用相同的编译器。

      其次,我不会尝试在 Maven 构建中使用任何 Eclipse 组件。它们被设计为在 Eclipse IDE 中工作,因此让它们在 Eclipse IDE 之外工作通常会充满问题。我已经看到它完成了,但它是一个 hack,并没有产生很好的结果。

      第三,如果您在构建 Maven 时遇到性能问题(并不罕见),您可以采取一些措施。首先分解构建并确定时间的去向。我的经验是,通常问题不是编译。以下是我看到的减慢构建速度的列表:

      • 质量差的测试。启动集成测试通常很慢,加上实际上是作为集成运行的单元测试。

      • Cobertura。很棒的工具,但由于 Maven 的工作方式,Cobertura 插件必须再次运行从资源到编译的所有阶段。我曾经通过编写一个插件来停止运行测试,直到它们在 cobertura 阶段运行,从而在长时间的 Maven 构建期间节省了 40%。

      • 过度建设。 IE。包括基本上永远不会改变的子模块。更好的选择是仅在必要时创建包含这些子移动设备的配置文件,或者拆分为完全独立的构建。

      • 长集成测试。如果集成测试需要很长时间,请考虑将它们放入不同的配置文件和 CI 服务器上的不同构建中。然后,您的主构建可以更快地运行,从而使开发人员可以更快地恢复工作,而集成测试的运行频率可以降低。

      • 最后 - 承认 Maven 是性能狂,并转向更快的东西。 Ant 可能仍然是最快的,但设置起来很痛苦,因为您必须手动配置所有内容。我建议试用Grandle,因为它解决了 Ant 和 Maven 都存在的许多问题。虽然老实说,我个人并没有对其进行任何性能测试。但它确实为您提供了 Maven 所没有的控制级别。

      【讨论】:

      • 感谢德里克的建议。老实说我不知道​​到底有什么区别,但可以肯定的是eclipse和maven不会生成相同的类文件,我只是做了一个比较。另请注意,我没有直接在 maven 构建中使用 eclipse 组件,这是一个 plexus 工件以这种方式使用。我实际上对 maven 的性能非常满意,我的问题是当我使用 maven 构建时,eclipse 会重新构建工作区。这就是为什么我希望 Maven 构建和 Eclipse 增量构建共享相同的编译器。
      • 酷,我已经看到了这个问题。它通常是由使用目标/类和目标/测试类的 eclipse 构建路径设置引起的。因为maven cleanmaven compile 操纵了这些目录,Eclipse 看到了更改并假定它必须编译。一个有效的解决方法是不使用相同的目录。在 Eclipse 中,您还可以告诉 Eclipse 忽略/隐藏某些目录,这样您就看不到 Maven 目标目录。
      • 我一开始有一个单独的 eclipse 和 maven 目标。但这意味着我必须编译两次对代码的任何修改。这就是我首先合并 eclipse 目标和 maven 目标的原因。因此我的问题。
      猜你喜欢
      • 2016-08-10
      • 2016-01-14
      • 2019-09-18
      • 2014-04-13
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      相关资源
      最近更新 更多