尝试通过 ant 编译时 --add-modules 的值中的错误名称
bad name in value for --add-modules when trying to compile through ant
我试图在我的项目中包含 javafx.controls
模块并通过 ant 编译它,而不是使用 javaFX javac --module-path "..\lib\javafx-sdk-17.0.2\lib" --add-modules javafx.controls App.java
java --module-path "..\lib\javafx-sdk-17.0.2\lib" --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:\xampp\htdocs\projectName/lib/javafx-sdk-17.0.2/lib/javafx.controls'
。我已经查找了错误,但我认为答案非常模糊,并没有帮助我获得更多关于错误的知识。
你做错了什么
您向 --add-modules
提供的值不正确。
您没有向 ant 提供与您问题中的示例命令匹配的字符串。
在您的问题中,对于示例 javac 命令,您有:
--module-path "..\lib\javafx-sdk-17.0.2\lib" --add-modules javafx.controls
但是在你的 ant 脚本中你有
--add-modules ${lib.dir}/javafx-sdk-17.0.2/lib/javafx.controls
您试图用 --add-modules
参数压缩 --module-path
参数。这些参数必须保持独立并具有不同的值。
ant javac 支持 Java 平台模块系统
ant javac task 有一些与 Java 模块系统一起工作的参数,您应该使用合适的参数:
模块路径
使用它来引用包含您的 JavaFX 模块的目录集(例如 SDK lib 目录)。
不要将 JavaFX 库放在 class 路径上,它们是模块并且属于模块路径。
ant 脚本所需的特定更改
我对 ant 参数语法不够熟悉,无法提供准确的 ant XML 元素来正确定义您的案例的参数。
如果有人知道 ant 元素语法中所需的确切值,他们可以编辑此答案并将值放在这里。
背景资料
如果您想了解 --module-path
和 --add-modules
参数是什么、应该向它们提供什么数据以及该数据所需的格式,请阅读 javac man page。
同时评论 understanding java 9 modules。
替代方法:定义模块信息
作为通过 --add-modules
VM 参数添加模块的替代方法,您可以在您的应用程序中定义一个 module-info.java
文件以使其模块化并在那里需要模块。
如果您不依赖 non-modular 代码,这会很好地工作。
即使你定义了一个module-info.java
文件,你仍然需要为编译器和运行时设置--module-path
,这样它才能找到模块实现。 Maven 等构建工具将自动为定义的依赖项执行此操作。
但是,ant 不了解构建依赖关系,需要手动帮助参数来支持模块系统。您需要通过编译器的模块路径参数手动设置模块路径。同样,如果在 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"/>
我试图在我的项目中包含 javafx.controls
模块并通过 ant 编译它,而不是使用 javaFX javac --module-path "..\lib\javafx-sdk-17.0.2\lib" --add-modules javafx.controls App.java
java --module-path "..\lib\javafx-sdk-17.0.2\lib" --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:\xampp\htdocs\projectName/lib/javafx-sdk-17.0.2/lib/javafx.controls'
。我已经查找了错误,但我认为答案非常模糊,并没有帮助我获得更多关于错误的知识。
你做错了什么
您向 --add-modules
提供的值不正确。
您没有向 ant 提供与您问题中的示例命令匹配的字符串。
在您的问题中,对于示例 javac 命令,您有:
--module-path "..\lib\javafx-sdk-17.0.2\lib" --add-modules javafx.controls
但是在你的 ant 脚本中你有
--add-modules ${lib.dir}/javafx-sdk-17.0.2/lib/javafx.controls
您试图用 --add-modules
参数压缩 --module-path
参数。这些参数必须保持独立并具有不同的值。
ant javac 支持 Java 平台模块系统
ant javac task 有一些与 Java 模块系统一起工作的参数,您应该使用合适的参数:
模块路径
使用它来引用包含您的 JavaFX 模块的目录集(例如 SDK lib 目录)。
不要将 JavaFX 库放在 class 路径上,它们是模块并且属于模块路径。
ant 脚本所需的特定更改
我对 ant 参数语法不够熟悉,无法提供准确的 ant XML 元素来正确定义您的案例的参数。
如果有人知道 ant 元素语法中所需的确切值,他们可以编辑此答案并将值放在这里。
背景资料
如果您想了解 --module-path
和 --add-modules
参数是什么、应该向它们提供什么数据以及该数据所需的格式,请阅读 javac man page。
同时评论 understanding java 9 modules。
替代方法:定义模块信息
作为通过 --add-modules
VM 参数添加模块的替代方法,您可以在您的应用程序中定义一个 module-info.java
文件以使其模块化并在那里需要模块。
如果您不依赖 non-modular 代码,这会很好地工作。
即使你定义了一个module-info.java
文件,你仍然需要为编译器和运行时设置--module-path
,这样它才能找到模块实现。 Maven 等构建工具将自动为定义的依赖项执行此操作。
但是,ant 不了解构建依赖关系,需要手动帮助参数来支持模块系统。您需要通过编译器的模块路径参数手动设置模块路径。同样,如果在 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"/>