Я хотел бы использовать компилятор Rhino JavaScript для компиляции некоторых файлов JavaScript в файлы байт-кода .class для использования в проекте. Похоже, что это уже должно существовать, поскольку есть задачи groovyc, netrexxc и jythonc для Groovy, NetREXX (!) И Jython соответственно. Кто-нибудь использовал или писал такую задачу Ant, или кто-нибудь может дать несколько советов о том, как ее написать?
В идеале у него должен быть способ разрешить зависимости между классами JavaScript или Java.




Почему бы просто не использовать java-задачу?
<java fork = "yes"
classpathref = "build.path"
classname = "org.mozilla.javascript.tools.jsc.Main"
failonerror = "true">
<arg value = "-debug"/>
...
<arg value = "file.js"/>
</java>
Есть возражения?
Вот образец build.xml, который я использую для своих приложений rhino. Если у вас много файлов javascript, вам просто нужно добавлять больше тегов ~: ant compile jar run
<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>
~
Я использую RequireJS в своем проекте, который включает сценарий, который отслеживает зависимости между модулями и объединяет их в один файл JavaScript. При желании он также может минимизировать объединенный файл js с помощью компилятора Google Closure. Когда он находится в этой форме, где все зависимости включены в один файл 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>
Полный сценарий сборки можно найти здесь.
Хм, основная проблема - это обработка зависимостей между классами Java и JavaScript. Тем не менее, на данный момент этого может быть достаточно для работы - спасибо.