在 Eclipse 中创建 ecj.jar 文件
Create ecj.jar file in Eclipse
我对 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 时一切正常,但我想从命令行(在无头构建或使用 ant 中)编译不同的项目,为此我需要创建新的 ecj.jar
文件。我尝试构建这个库:
https://github.com/maxeler/maxpower
根据这篇文章:
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-compiler
执行该项目的 pom.xml.
否则,更 light-weight 的方法应该是使用 scripts/export-ecj.xml
调用 Ant。该文件可能有点 out-of-date,但您可以看一下它是如何适应创建 ecj 的另一个变体的(对于 OT/J), see: http://git.eclipse.org/c/objectteams/org.eclipse.objectteams.git/tree/org.eclipse.jdt.core/scripts/export-ecj.xml。
对于OT/J,此脚本是从Ant-based PDE-build 进程调用的,因此对于独立调用,需要先配置一堆属性。
- 集成 apt 和工具需要那些兄弟项目位于预期的位置,并设置
build.root.dir
等属性。否则,评论 apt 和工具部分应该可以让你继续。
- 将
buildLabel
设置为有用的东西
通过这些准备工作,我可以从 IDE.
中成功 运行 Ant
我对 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 时一切正常,但我想从命令行(在无头构建或使用 ant 中)编译不同的项目,为此我需要创建新的 ecj.jar
文件。我尝试构建这个库:
https://github.com/maxeler/maxpower
根据这篇文章:
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-compiler
执行该项目的 pom.xml.
否则,更 light-weight 的方法应该是使用 scripts/export-ecj.xml
调用 Ant。该文件可能有点 out-of-date,但您可以看一下它是如何适应创建 ecj 的另一个变体的(对于 OT/J), see: http://git.eclipse.org/c/objectteams/org.eclipse.objectteams.git/tree/org.eclipse.jdt.core/scripts/export-ecj.xml。
对于OT/J,此脚本是从Ant-based PDE-build 进程调用的,因此对于独立调用,需要先配置一堆属性。
- 集成 apt 和工具需要那些兄弟项目位于预期的位置,并设置
build.root.dir
等属性。否则,评论 apt 和工具部分应该可以让你继续。 - 将
buildLabel
设置为有用的东西
通过这些准备工作,我可以从 IDE.
中成功 运行 Ant