【问题标题】:Has anyone used or written an Ant task to compile (Rhino) JavaScript to Java bytecode?有没有人使用或编写过 Ant 任务来将(Rhino)JavaScript 编译为 Java 字节码?
【发布时间】:2008-10-23 21:11:51
【问题描述】:

我想使用 Rhino JavaScript 编译器将一些 JavaScript 编译为 .class 字节码文件,以便在项目中使用。看起来这应该已经存在,因为 Groovy、NetREXX(!) 和 Jython 分别有 groovyc、netrexxc 和 jythonc 任务。有没有人使用或编写过这样的 Ant 任务,或者任何人都可以提供一些关于如何编写的提示?

理想情况下,它应该有一些方法来解决 JavaScript 或 Java 类之间的依赖关系。

【问题讨论】:

    标签: java javascript ant rhino


    【解决方案1】:

    我在我的项目中使用RequireJS,其中包括一个脚本,该脚本跟踪模块之间的依赖关系,并将它们组合成一个 JavaScript 文件。或者,它还可以使用 Google Closure 编译器缩小组合的 js 文件。一旦采用这种形式,其中所有依赖项都包含在单个 js 文件中,就可以使用 jsc 轻松编译该文件。

    这是我的 ant 脚本的一部分,我用它来创建单个组合 js 文件,将其编译为类文件,然后创建一个可执行的 JAR:

    <target name="compile-single-js">
        <mkdir dir="${build-js}"/>
    
        <java classname="org.mozilla.javascript.tools.shell.Main">
            <classpath>
                <path refid="rhino-classpath"/>
                <path refid="closure-classpath"/>
            </classpath>
            <arg value="${js-build-script}"/>
            <arg value="${js-build-dir}"/>
            <arg value="name=${build-js-main-rhino-frontend-module}"/> 
            <arg value="out=${build-js-main}"/>
            <arg value="baseUrl=."/>
            <arg value="includeRequire=true"/>
            <arg value="inlineText=true"/> 
            <arg value="optimize=none"/>
        </java>
    </target>
    
    <target name="compile-single-class" depends="compile-single-js">
        <mkdir dir="${build-class}"/>
    
        <!-- TODO: set -opt -->
        <java classname="org.mozilla.javascript.tools.jsc.Main">
            <classpath>
                <path refid="rhino-classpath"/>
            </classpath>
            <arg value="-o"/>
            <arg value="${build-class-main-name}.class"/>
            <arg value="${build-js-main}"/>
        </java>
        <move file="${build-js}/${build-class-main-name}.class" todir="${build-class}"/>
    </target>
    
    <target name="jar-single-class" depends="compile-single-class">
        <mkdir dir="${build-jar}"/>
    
        <jar destfile="${build-jar-main}"
            basedir="${build-class}"
            includes="${build-class-main-name}.class">
            <manifest>
                <attribute name="Main-Class" value="${build-class-main-name}" />
            </manifest>
        </jar>
    </target>
    

    完整的构建脚本可以在here找到。

    【讨论】:

      【解决方案2】:

      为什么不简单地使用 java 任务?

      <java fork="yes" 
        classpathref="build.path" 
        classname="org.mozilla.javascript.tools.jsc.Main" 
        failonerror="true">
          <arg value="-debug"/>
              ...
          <arg value="file.js"/>          
      </java>
      

      有异议吗?

      【讨论】:

      • 嗯,主要关注的是处理 Java 和 JavaScript 类之间的依赖关系。不过,现在这可能已经足够了——谢谢。
      【解决方案3】:

      这是我用于我的 rhino 应用程序的示例 build.xml。如果您有很多 javascript 文件,您只需要不断添加更多标签
      ~:ant 编译 jar 运行

      <project>
      <target name="compile">
          <mkdir dir="build/classes"/>
          <java fork="yes" 
            classpath="js.jar" 
            classname="org.mozilla.javascript.tools.jsc.Main" 
            failonerror="true">
              <arg value="-nosource"/>
              <arg value="-opt"/>
              <arg value="9"/>
              <arg value="-version"/>
              <arg value="170"/>
              <arg value="src/SwingApplication.js"/>
          </java>
          <move todir="build/classes">
              <fileset dir="src">
                  <include name="**/*.class"/>
              </fileset>
          </move>
      </target>
      <target name="jar">
          <mkdir dir="build/jar"/>
          <jar destfile="build/jar/SwingApplication.jar" basedir="build/classes">
              <zipfileset src="js.jar" includes="**/*.class"/>
              <manifest>
                  <attribute name="Main-Class" value="SwingApplication"/>
              </manifest>
          </jar>
      </target>
      <target name="run">
          <exec executable="java">
              <arg valUe="-jar"/>
              <arg value="build/jar/SwingApplication.jar"/>
          </exec>
      </target>
      </project>
      

      ~

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        相关资源
        最近更新 更多