如何使用独立编译器编译Xtend源?

时间:2014-09-17 06:13:28

标签: java jar xtend

这是我的第一个问题。

我使用以下说明创建了 Xtend 的独立编译器。

  • 使用 Ant 常春藤
  • 构建
  • 目录为: lib / 构建/
  • “xtend-compiler.jar”将在 build /
  • 上输出
  • lib /
  • 上下载库
  • Jar文件包含依赖库
  • Main-class org.eclipse.xtend.core.compiler.batch.Main

的build.xml:

<project name="xtend-compiler" default="jar-run" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
  <property name="lib.dir" value="lib" />
  <property name="build.dir" value="build" />

  <path id="lib.path.id">
    <fileset dir="${lib.dir}"/>
  </path>

  <!-- resolve -->
  <target name="resolve">
    <mkdir dir="${lib.dir}"/>
    <ivy:retrieve pattern="${lib.dir}/[artifact].[ext]"/>
  </target>

  <!-- jar -->
  <target name="jar">
    <delete dir="${build.dir}"/>
    <copy file="${lib.dir}/org.eclipse.xtend.standalone.jar" tofile="${build.dir}/xtend-compiler.jar"/>
    <jar update="true" destfile="${build.dir}/xtend-compiler.jar">
      <zipgroupfileset dir="${lib.dir}" includes="**/*.jar" excludes="org.eclipse.xtend.standalone.jar"/>
      <manifest>
        <attribute name="Main-Class" value="org.eclipse.xtend.core.compiler.batch.Main"/>
      </manifest>
    </jar>
  </target>

  <!-- run -->
  <target name="run">
    <java jar="${build.dir}/xtend-compiler.jar" fork="true">
    </java>
  </target>

  <target name="jar-run" depends="jar,run">
  </target>
</project>

的ivy.xml:

<ivy-module version="2.0">
    <info organisation="" module="xtend-compiler"/>

    <configurations>
      <conf name="web"/>
    </configurations>

    <dependencies>
      <dependency org="org.eclipse.xtend" name="org.eclipse.xtend.standalone" rev="2.4.3" conf="web->default"/>
    </dependencies>
</ivy-module>



在我构建Jar文件后,我尝试运行

java -jar build/xtend-compiler.jar

这表明:

Usage: Main <options> <source directories>
where possible options include:
-d <directory>             Specify where to place generated xtend files
-tp <path>                 Temp directory to hold generated stubs and classes
-cp <path>                 Specify where to find user class files
-encoding <encoding>       Specify character encoding used by source files
-useCurrentClassLoader     Use current classloader as parent classloader

然后我要编译 HelloWorld.xtend

class HelloWorld {
  def static void main(String[] args) {
    System.out.println("Hello World")
  }
}

但我做不到。例如:

java -jar build/xtend-compiler.jar HelloWorld.xtend

  Exception in thread "main" java.lang.NullPointerException
  at java.io.File.<init>(File.java:277)
  at org.eclipse.xtend.core.compiler.batch.XtendBatchCompiler.configureWorkspace(XtendBatchCompiler.java:258)
  at org.eclipse.xtend.core.compiler.batch.XtendBatchCompiler.compile(XtendBatchCompiler.java:273)
  at org.eclipse.xtend.core.compiler.batch.Main.main(Main.java:48)

源文件位于资源目录中。

如何编译?

补编

我找到了 org.eclipse.xtend.core.compiler.batch.Main 的来源:

https://github.com/eclipse/xtext/blob/master/plugins/org.eclipse.xtend.core/src/org/eclipse/xtend/core/compiler/batch/Main.java

我正在读它,但现在我不明白要为参数添加什么。

1 个答案:

答案 0 :(得分:1)

我自己解决了。

java -jar build/xtend-compiler.jar -cp build/xtend-compiler.jar resource -d .

#  0  [main] INFO  e.compiler.batch.XtendBatchCompiler  - Compiling 1 source file to .
#  0  [main] INFO org.eclipse.xtend.core.compiler.batch.XtendBatchCompiler  - Compiling 1 source file to .

javac -cp build/xtend-compiler.jar:. HelloWorld.java
java -cp build/xtend-compiler.jar:. HelloWorld

#  Hello World