java ecj_java - 在Maven构建中使用Eclipse Java Compiler(ecj) - 堆栈内存溢出

与标准Javac编译器相比,Eclipse Java编译器(ecj)具有很多优势。 它速度很快,并且可以配置更多警告和错误,从而提高了代码质量。 编译器中最有趣的事情之一是在编译器内部添加了null类型 :通过使用@Nullable和@NotNull注释对代码进行注释,可以强制Eclipse编译器在编译时而不是运行时检查null访问。 严格应用时,它会教您以更安全的方式编码(通过防止空值),并防止在测​​试或生产过程中发生NPE异常。

在Maven内部使用Eclipse编译器并不难,但是Internet上存在很多错误信息和旧信息,这引起了很多混乱。 我希望这有助于使事情变得正确。

要使Eclipse使用ecj编译器,您需要使用plexus-compiler-eclipse插件,而无需使用其他任何工具。 典型的配置如下:

org.apache.maven.plugins

maven-dependency-plugin

org.apache.maven.plugins

maven-compiler-plugin

3.7.0

eclipse

${source.jdk.version}

${target.jdk.version}

${project.basedir}/.settings/org.eclipse.jdt.core.prefs

true

true

org.codehaus.plexus

plexus-compiler-eclipse

2.8.3

org.eclipse.jdt

ecj

3.13.101

将这部分放在您的父/根pom的pluginManagement或build部分中。

现在让我们解释不同的部分;)

maven-compiler-plugin必须是最新版本。 源参数和目标参数定义了用于源代码和字节码的Java版本,通常是相同的。

将参数传递给编译器是一个彻底的麻烦。 请参阅下面的单独部分。 在本示例中,我使用属性设置,该属性设置使我能够提供详细的设置,以进行编译时要出现的错误和警告。 通过在参数中使用$ {project.basedir}变量,我对每个项目进行了以下设置:每个项目都需要有一个.settings / org.eclipse.jdt.core.prefs文件(很幸运,该文件所在的位置Eclipse IDE会保留其编译器设置)。

对plexus-codehaus-eclipse的依赖关系定义了知道如何运行Eclipse编译器的插件。 2.8.3版本是撰写本文时的最新版本,但该版本存在一些问题。 2.8.4版应该带有一个改写后的编译器接口,该接口可以解决很多问题,但在撰写本文时仍在使用此版本。 您可以在此处找到有关该插件的详细信息 ,因此可以在新发行版/代码更改后关注进度。

另一个重要的依赖项是org.eclipse.jdt:ecj依赖项:这个依赖项指定了要使用的ecj编译器的确切版本 。 您应该始终指定它,因为如果在发布大版本之前一天插件决定使用另一版本的编译器,则构建稳定性会受到损害;)用于ecj编译器的版本号有点问题。 您也许可以从发行列表中找到版本号,然后检查该Maven存储库中是否有类似的东西。 但是此存储库仅包含旧版本。 当您需要更新的版本时,您显然应该在此处查看 该版本 -这是Eclipse 当前发布其版本的地方 。 这个较新的存储库消除了较早版本的易于识别的版本号; 如上所述,它使用的版本号如3.1xx。 Eclipse通常每年发布一次主要版本,中间还发布一个或两个修订版本。 3.13.x编号的第二部分对应于Eclipse Platform项目中用于发行版的内部版本控制。 很难获得列表,但至少这些是已知的:

Version Eclipse Release Compiler Version

3.13.0 Oxygen Release 4.7

3.13.50 Oxygen 1a 4.7.1a

3.13.100 Oxygen R2 4.7.2

该版本始终以3开头,13或多或少是发布的“年份”。 因此,当13为Oxygen(2017,4.7)时14可能是光子(2018,4.8)。

plexus-compiler-eclipse插件的版本:2.8.4之前

plexus-compiler-plugin 2.8.4之前的版本使用内部API启动Eclipse编译器。 这会导致很多事情无法正常运行,例如,此内部API不能解释ecj编译器的常规命令行参数。 这使其很难使用,并且不支持某些功能。 以下是限制列表:

注释处理未实现。 任何配置都会被静默忽略。

使用标记添加特定参数非常困难,因为实现存在多个问题:

编译器mojo似乎会在此处输入的所有参数中添加破折号。 但是,此版本插件使用的内部API需要带破折号的参数。 因此,插件再次将其删除。 由于这里的参数并不是真正的命令行ecj参数,因此很难知道要使用哪些参数:有关细节,请查看Eclipse源代码中的Compiler.java类和CompilerOptions.java类。

插件确实在此处接受一些参数,但是这些参数由插件本身解释,然后“翻译”为内部api。

此插件在>标记中接受以下参数:

文件名 properties>:定义一个属性文件,该文件将传递给编译器的-properties参数。 通过查看Eclipse项目中的.settings / org.eclipse.jdt.core.prefs文件,可以找到此文件格式的示例:该文件存储编译器的配置。 它包含警告,错误和信息性消息的设置以及编译器符合性设置。

任何内容 errorsAsWarnings>。 有效时,插件将忽略编译器生成的任何错误,并将其报告为警告。 当然,编译仍然会失败,因此根据错误,可能已经编写/更新了.class文件。 这由插件本身处理:它只是将所有错误更改为警告,并告诉世界编译工作。

从2.8.4开始

plexus-compiler-eclipse插件的2.8.4版本已被大部分重写。 现在,它使用ECJ编译器的公共API,或多或少是ECJ编译器本身。 举例来说,这意味着ECJ插件现在可以做的所有事情(例如注释处理),并且将标签中输入的参数传递给编译器,这意味着您应该能够使用ecj的帮助页面来查找有趣的东西。要添加的参数。

像以前的版本一样,该版本还要求您从所有参数名称中删除“-”。 在将参数名称添加到ecj命令行之前,会再次自动添加破折号。

该版本支持Maven定义的注释处理。 通过将所需的部分添加到编译Blob中,可以运行注释处理器。 例如:

org.apache.maven.plugins

maven-compiler-plugin

${maven-compiler-plugin.version}

db.annotationprocessing.EntityAnnotationProcessor

to.etc.domui

property-annotations-processor

1.2-SNAPSHOT

to.etc.domui

property-annotations-processor

1.2-SNAPSHOT

这部分似乎不完整,因为根本没有引用plexus-compiler-eclipse插件,但是请记住,在Maven中,该配置继承了:在这种情况下,父POM包含上面的部分,而这只是为该部分添加了一些配置。仅此POM的项目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在DEA(Digital Evolution Algorithm)使用ECJ(Evolutionary Computation in Java)进行编译时,如果出现java.lang.illegalargumentexception异常,通常表示传递给方法的参数不合法。 java.lang.illegalargumentexception异常是IllegalArgumentException类的子类,它表示非法或不合适的参数。它是运行时异常,意味着在程序执行期间可能会抛出该异常。 要解决这个异常,我们需要检查传递给方法的参数是否符合方法的要求,包括参数的类型、范围或其他限制条件。可以检查以下几个方面: 1. 参数的类型:确保传递给方法的参数的类型与方法定义的参数类型匹配。如果参数类型不匹配,可以尝试将其转换为正确的类型。 2. 参数的范围:如果参数有范围限制,例如必须在特定的范围内(如0到100之间),请确保传递的参数值在合法范围之内。 3. 参数的有效性:如果方法对参数值有其他限制条件(例如非空),请确保传递的参数值满足这些条件。 在使用ECJ编译过程出现java.lang.illegalargumentexception异常时,可以根据异常的具体信息来判断参数的错误位置并进行调试。根据异常堆栈跟踪,可以定位到引发异常的代码行,并检查涉及的参数。 根据这些检查,我们可以修复参数错误,确保传递给方法的参数是合法的。修改后,再次进行编译时就不会再出现java.lang.illegalargumentexception异常了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值