我正试图将javafx.controls
模块包含在我的项目中,并通过ant编译它,而不是使用javaFXjavac --module-path "..libjavafx-sdk-17.0.2lib" --add-modules javafx.controls App.java
java --module-path "..libjavafx-sdk-17.0.2lib" --add-modules javafx.controls App
命令编译文件。
这就是我的蚂蚁build.xml
现在的样子:
<project name="projectName" default="dist">
<property file="build.properties"/>
<property file="${user.home}/build.properties"/>
<path id="run.classpath">
<fileset dir="${dist.dir}">
<include name="${project.name}.jar"/>
</fileset>
</path>
<target name="compile">
<mkdir dir="${build.dir}"/>
<javac srcdir="${src.dir}"
destdir="${build.dir}"
debug="${compile.debug}"
deprecation="${compile.deprecation}"
optimize="${compile.optimize}"
includeantruntime="false">
<classpath>
<fileset dir="${lib.dir}/javafx-sdk-17.0.2/lib">
<include name="**/*.jar" />
</fileset>
</classpath>
<compilerarg line="--add-modules ${lib.dir}/javafx-sdk-17.0.2/lib/javafx.controls"/>
</javac>
</target>
<target name="dist" depends="compile">
<mkdir dir="${dist.dir}"/>
<jar jarfile="${dist.dir}/${project.name}.jar"
basedir="${build.dir}"
manifest="${src.dir}/Manifest.mf">
<zipgroupfileset dir="${lib.dir}/javafx-sdk-17.0.2/lib" includes="**/*.jar"/>
</jar>
</target>
<target name="build" depends="dist">
<java jar="${dist.dir}/${project.name}.jar" fork="true">
</java>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
</target>
</project>
我不断得到的错误是:error: bad name in value for --add-modules option: 'C:xampphtdocsprojectName/lib/javafx-sdk-17.0.2/lib/javafx.controls'
。我查过这个错误,但在我看来,答案非常模糊,并没有帮助我了解更多关于这个错误的信息。
你做错了什么
您为--add-modules
提供的值不正确。
您没有向ant提供与问题中的示例命令匹配的字符串。
在您的问题中,对于示例javac命令,您有:
--module-path "..libjavafx-sdk-17.0.2lib" --add-modules javafx.controls
但在你的蚂蚁脚本中,你有
--add-modules ${lib.dir}/javafx-sdk-17.0.2/lib/javafx.controls
您已尝试使用--add-modules
参数压缩--module-path
参数。这些参数必须保持独立,并且具有不同的值。
ant javac对Java平台模块系统的支持
ant javac任务有一些用于处理Java模块系统的参数,您应该使用适当的参数:
模块路径
使用它可以引用包含JavaFX模块的目录集(例如SDK lib目录(。
不要将JavaFX库放在类路径上,它们是模块,属于模块路径。
蚂蚁脚本所需的特定更改
我对ant参数语法不够熟悉,无法为您的案例提供正确的参数定义所需的确切ant XML元素。
如果有人知道ant元素语法中所需的确切值,他们可以编辑这个答案并将值放在这里。
背景信息
如果您想了解--module-path
和--add-modules
参数是什么,应该向它们提供什么数据,以及这些数据所需的格式,请阅读javac手册页。
还要回顾一下对java9模块的理解。
替代方法:定义模块信息
作为通过--add-modules
VM参数添加模块的替代方案,您可以在应用程序中定义一个module-info.java
文件,使其模块化,并要求在那里使用模块。
如果您不依赖非模块化代码,这将很好地工作。
即使定义了module-info.java
文件,仍然需要为编译器和运行时设置--module-path
,以便它能够找到模块实现。像Maven这样的构建工具将为定义的依赖项自动执行此操作。
然而,ant不知道构建依赖关系,需要手动帮助参数来支持模块系统。您需要通过编译器的modulepath参数手动设置模块路径。类似地,如果您在ant中有一个java执行任务,则需要为运行时模块支持设置VM参数。
解决方案
<target name="compile">
<mkdir dir="${build.dir}"/>
<javac srcdir="${src.dir}"
destdir="${build.dir}"
debug="${compile.debug}"
deprecation="${compile.deprecation}"
optimize="${compile.optimize}"
includeantruntime="false">
<classpath>
<fileset dir="${lib.dir}/javafx-sdk-17.0.2/lib">
<include name="**/*.jar" />
</fileset>
</classpath>
<compilerarg line="--module-path ${lib.dir}/javafx-sdk-17.0.2/lib/"/>
<compilerarg line="--add-modules javafx.controls"/>
</javac>
</target>
<target name="build" depends="dist">
<java jar="${dist.dir}/${project.name}.jar" fork="true">
<jvmarg line="--module-path ${lib.dir}/javafx-sdk-17.0.2/lib/"/>
<jvmarg line="--add-modules javafx.controls"/>
</java>
</target>
首先将compilerarg
与line
一起使用,以指示在javac
过程中要编译的内容。
<compilerarg line="--module-path ${lib.dir}/javafx-sdk-17.0.2/lib/"/>
<compilerarg line="--add-modules javafx.controls"/>
然后,您也可以在java
过程中提供这些行。
<jvmarg line="--module-path ${lib.dir}/javafx-sdk-17.0.2/lib/"/>
<jvmarg line="--add-modules javafx.controls"/>