java - 在 Eclipse 中创建 ecj.jar 文件

标签 java eclipse ecj

我对 elipse.jdt.core 插件做了一些更改,以支持类似于 Java 的语言(MaxJ)。我所做的更改可以在这里找到:

https://github.com/maxeler/eclipse.jdt.core/tree/MAXJ_4_4_maintenance

可以在这里找到我的插件的版本:

https://github.com/maxeler/eclipse/releases

当我在 GUI 模式下使用 eclipse 时一切正常,但我想从命令行编译不同的项目(在 headless 构建或使用 ant 中),为此我需要创建新的 ecj.jar 文件。我尝试构建这个库:

https://github.com/maxeler/maxpower

根据这篇文章:

http://help.eclipse.org/kepler/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-ant_javac_adapter.htm

jdtCompilerAdapter.jar 可以用来代替 ecj.jar 但这不起作用,因为它不包含编译器类(如 CompilerOptions 等)。 在 build.xml 文件中,我更改了以下几行:

<taskdef name="maxjcompiler" classname="org.eclipse.jdt.core.ant.taskdef.MaxjTask" classpath="${env.MAXCOMPILERDIR}/lib/MaxIDE/ecj.jar" onerror="ignore"/>
<taskdef name="maxjdoc" classname="org.eclipse.jdt.core.ant.taskdef.MaxjDocTask" classpath="${env.MAXCOMPILERDIR}/lib/MaxIDE/ecj.jar"/>

这样:

<taskdef name="maxjcompiler" classname="org.eclipse.jdt.core.ant.taskdef.MaxjTask" classpath="/pathToMyJar/jdtCompilerAdapter.jar" onerror="ignore"/>
<taskdef name="maxjdoc" classname="org.eclipse.jdt.core.ant.taskdef.MaxjDocTask" classpath="/home/ikulezic/Desktop/jdtCompilerAdapter.jar"/>

然后我运行此命令来启动构建过程:

ant

它会产生以下错误:

Buildfile: /home/ikulezic/Desktop/maxpower/build.xml
 [taskdef] Could not load definitions from resource org/jacoco/ant/antlib.xml. It could not be found.

clean:
  [delete] Deleting directory /home/ikulezic/Desktop/maxpower/bin

compile:
    [echo] 
    [echo] Using maxeda classpath '/opt/maxcompiler/lib/MaxCompiler.jar'
    [echo]   (Precedence: 1. $MAXCOMPILERJCP, 2. $MAXCOMPILERDIR)
    [echo] 
    [echo]                 
   [mkdir] Created dir: /home/ikulezic/Desktop/maxpower/bin

BUILD FAILED
/home/ikulezic/Desktop/maxpower/build.xml:66: Could not create type maxjcompiler due to java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/compiler/impl/CompilerOptions
       at org.eclipse.jdt.core.ant.taskdef.MaxjTask.<init>(MaxjTask.java:80)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
       at org.apache.tools.ant.AntTypeDefinition.innerCreateAndSet(AntTypeDefinition.java:328)
       at org.apache.tools.ant.AntTypeDefinition.createAndSet(AntTypeDefinition.java:274)
       at org.apache.tools.ant.AntTypeDefinition.icreate(AntTypeDefinition.java:219)
       at org.apache.tools.ant.AntTypeDefinition.create(AntTypeDefinition.java:206)
       at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:285)
       at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:263)
       at org.apache.tools.ant.UnknownElement.makeObject(UnknownElement.java:429)
       at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)
       at org.apache.tools.ant.Task.perform(Task.java:347)
       at org.apache.tools.ant.Target.execute(Target.java:435)
       at org.apache.tools.ant.Target.performTasks(Target.java:456)
       at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
       at org.apache.
 at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
       at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
       at org.apache.tools.ant.Main.runBuild(Main.java:851)
       at org.apache.tools.ant.Main.startAnt(Main.java:235)
       at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
       at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jdt.internal.compiler.impl.CompilerOptions
       at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1366)
       at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1315)
       at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1068)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
       ... 24 more

Total time: 0 seconds

目前看来唯一的选择是构建一个新的 ecj.jar 文件,但我找不到方法来做到这一点。

最佳答案

如何构建 ecj.jar 取决于您使用的构建技术。

如果您配置了上下文,以便可以使用 Maven/Tycho 构建 org.eclipse.jdt.core,那么您应该调整 batch-编译器在项目的pom.xml中执行。

否则,更轻量级的方法应该是使用 scripts/export-ecj.xml 调用 Ant。该文件可能有点过时,但您可以看看如何调整它来创建 ecj 的另一个变体(对于 OT/J ),请参阅: http://git.eclipse.org/c/objectteams/org.eclipse.objectteams.git/tree/org.eclipse.jdt.core/scripts/export-ecj.xml

对于 OT/J,此脚本是从基于 Ant 的 PDE 构建过程中调用的,因此对于独立调用,需要首先配置一堆属性。

  • 集成 apt 和工具需要这些同级项目位于预期位置,并设置诸如 build.root.dir 之类的属性。否则,注释 apt 和工具部分应该可以帮助您继续。
  • buildLabel 设置为有用的内容

通过这些准备工作,我可以从 IDE 中成功运行 Ant。

关于java - 在 Eclipse 中创建 ecj.jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41829932/

相关文章:

android - Eclipse Neon 首选项具有重复的 Android 条目

android - 从 Eclipse 导入 Android 项目后,依赖项列表中的项目无效

java - 为什么 javac 为最终字段插入 Objects.requireNonNull(this) ?

java - 在 Eclipse/Intellij 中 Java 执行 "incremental compilation"的频率是多少?

java - 使用 Jsoup API : [parse(File in, String charsetName, String baseUri)]

java - 重新打印一个字符串数组Java

java - 如何让多个物体随机移动?

Java.util.Collection 重写 spliterator()

eclipse - 您如何将 PHP 框架添加到 Eclipse PDT 中的代码完成/辅助,并且该框架是否可以添加为所有项目的默认值?

java - 尝试打印 JAVA8 Collector 的结果时出现歧义错误