的值中有错误的名称--在尝试通过ant编译时添加模块



我正试图将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-modulesVM参数添加模块的替代方案,您可以在应用程序中定义一个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>

首先将compilerargline一起使用,以指示在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"/>

最新更新