为了账号安全,请及时绑定邮箱和手机立即绑定

Java 11 包在不导出它的模块中声明

Java 11 包在不导出它的模块中声明

慕田峪9158850 2023-05-24 16:29:42
我创建了两个模块化程序。一个是 JavaFX 模块化项目,其中包含module-info.java:module checker {    requires javafx.fxml;    requires javafx.controls;    requires TextInputProgram; // Btw, IDEA shows me here "Ambiguous module reference"    exports sample;    opens sample;}另一个包含module-info.java如下内容的 Maven 项目:module TextInputProgram {    requires selenium.api;    requires selenium.chrome.driver;}因此,我将模块化 Maven 项目作为外部 jar 添加到 JavaFX 中(通过 libs 中的项目结构和通过我指定的 jar 在模块信息中requires)。我还添加了包含用于编译的外部 jar 的变量(除了PATH_TO_FX和PATH_TO_FX_MODS):set EXTERNAL_JAR="...\out\artifacts\TextInputProgram_jar"但是当我试图通过命令编译项目时:dir /s /b src\*.java > sources.txt & javac --module-path %EXTERNAL_JAR%;%PATH_TO_FX% -d mods/checker @sources.txt & del sources.txt按照本教程我从 JavaFX 项目类中得到错误:\src\sample\Controller.java:9: error: package project is not visibleimport project.SeleniumProgram;       ^  (package project is declared in module TextInputProgram, which does not export it)1 errorPackage is declared in module which does not export itimport project.SeleniumProgram我在 JavaFX 项目中导入以使用来自外部 jar 的类。更新:如果我exports project;在 maven 项目的 module-info.java 中添加,那么我会在 JavaFX module-info.java 中看到错误:如果我删除,requires TextInputProgram;那么导入时会出现另一个错误我在这里错过了什么吗?我正在尝试获取这两个程序的可执行 Jar。
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

正如评论中所讨论的那样,这里可能存在一些问题:

  • 模块定义

  • 本地 jar 和依赖项

基于发布的模块化项目,我将创建一个小型演示多模块化项目来解释这两个问题。

Maven 多模块项目

使用您的 IDE,创建一个 Maven 项目,然后添加两个模块,TextInputProgram例如checker

父pom

<groupId>org.openjfx</groupId>

<artifactId>hellofx</artifactId>

<version>1.0-SNAPSHOT</version>

<modules>

    <module>TextInputProgram</module>

    <module>checker</module>

</modules>

<packaging>pom</packaging>

TextInputProgram pom


<parent>

    <groupId>org.openjfx</groupId>

    <artifactId>hellofx</artifactId>

    <version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>


<artifactId>TextInputProgram</artifactId>


<properties>

    <maven.compiler.source>11</maven.compiler.source>

    <maven.compiler.target>11</maven.compiler.target>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

</properties>


<dependencies>

    <dependency>

        <groupId>org.seleniumhq.selenium</groupId>

        <artifactId>selenium-java</artifactId>

        <version>3.141.59</version>

    </dependency>

</dependencies>


<build>

    <plugins>

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-compiler-plugin</artifactId>

            <version>3.8.1</version>

            <configuration>

                <release>11</release>

            </configuration>

        </plugin>

    </plugins>

</build>

Module-info.java


module TextInputProgram {

    requires selenium.api;

    requires selenium.chrome.driver;


    exports project to checker;

}

检查 pom


<parent>

    <artifactId>testMods</artifactId>

    <groupId>org.openjfx</groupId>

    <version>1.0-SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>


<artifactId>checker</artifactId>


<dependencies>

    <dependency>

        <groupId>org.openjfx</groupId>

        <artifactId>javafx-controls</artifactId>

        <version>12.0.2</version>

    </dependency>

    <dependency>

        <groupId>org.openjfx</groupId>

        <artifactId>javafx-fxml</artifactId>

        <version>12.0.2</version>

    </dependency>

    <dependency>

        <groupId>org.openjfx</groupId>

        <artifactId>TextInputProgram</artifactId>

        <version>1.0-SNAPSHOT</version>

    </dependency>

</dependencies>

<build>

    <plugins>

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-compiler-plugin</artifactId>

            <version>3.8.1</version>

            <configuration>

                <release>11</release>

            </configuration>

        </plugin>

        <plugin>

            <groupId>org.openjfx</groupId>

            <artifactId>javafx-maven-plugin</artifactId>

            <version>0.0.3</version>

            <configuration>

                <mainClass>sample.Main</mainClass>

            </configuration>

        </plugin>

    </plugins>

</build>

Module-info.java


module checker {

    requires javafx.fxml;

    requires javafx.controls;

    requires TextInputProgram;


    opens sample to javafx.fxml;


    exports sample;

}

(此时两个模块的代码无关紧要)。


包括解决方案

现在请注意,您必须将其添加到TextInputProgram模块描述符中:


exports project to checker;

如果你想让checker模块访问的TextInputProgram包project。


这将解决此错误:


包项目在模块 TextInputProgram 中声明,不导出它


另请注意,我已将此依赖项包含在checker项目中:


<dependency>

    <groupId>org.openjfx</groupId>

    <artifactId>TextInputProgram</artifactId>

    <version>1.0-SNAPSHOT</version>

</dependency>

即使有两个模块,在同一个父模块下,您也需要包含一个模块到另一个模块的依赖关系。否则这将失败(找不到模块):


requires TextInputProgram;

mvn clean install您可以在模块中运行TextInputProgram,以安装org.openjfx:TextInputProgram:1.0-SNAPSHOT在您的本地存储库中.m2。


然后您可以运行mvn clean javafx:runintchecker module来运行 GUI 项目。


值得一提的是,将两个 maven 依赖项与 jar 文件结合起来并不是一个好主意。如果您最终同时使用两者,您将收到此错误:


模块“检查器”从“TextInputProgram”和“TextInputProgram”中读取“项目”


此消息意味着模块路径中有两个模块具有完全相同的名称,一个是 maven 依赖项,另一个是 jar 工件。


为了分发您的项目和模块,最好使用 maven 方法,并避免在 lib 文件夹中包含 jar 文件。稍后你的模块将作为单独的工件发布,你不需要修改你的 pom 文件(除了更新版本号)。


查看完整回答
反对 回复 2023-05-24
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信