尝试通过 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>

首先使用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"/>