gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:01:24 25 4
gpt4 key购买 nike

我创建了两个模块化程序。一个是包含 module-info.java 的 JavaFX 模块化项目,例如:

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 中(通过库中的项目结构和模块信息中的 requires 我指定了 jar)。我还添加了包含用于编译的外部 jar 的变量(除了 PATH_TO_FXPATH_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

正在关注 this tutorial

我从 JavaFX 项目类中得到错误:

\src\sample\Controller.java:9: error: package project is not visible
import project.SeleniumProgram;
^
(package project is declared in module TextInputProgram, which does not export it)
1 error

Package is declared in module which does not export it

import project.SeleniumProgram 我在 JavaFX 项目中导入以使用来自外部 jar 的类。

更新:

如果我在 maven 项目的 module-info.java 中添加 exports project; 然后我在 JavaFX module-info.java 中看到错误:

enter image description here如果我删除 requires TextInputProgram; 那么导入时会出现另一个错误:

enter image description here

我是不是漏掉了什么?我正在尝试获取这两个程序的可执行 Jar。

最佳答案

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

  • 模块定义

  • 本地 jar 和依赖项

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

Maven 多模块项目

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

父 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模块访问TextInputProgramproject包。

这将解决这个错误:

package project is declared in module TextInputProgram, which does not export it

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

<dependency>
<groupId>org.openjfx</groupId>
<artifactId>TextInputProgram</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

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

requires TextInputProgram;

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

然后您可以在 checker 模块 中运行 mvn clean javafx:ru​​n 来运行 GUI 项目。

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

Module 'checker' reads 'project' from both 'TextInputProgram' and 'TextInputProgram'

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

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

关于Java 11 包在不导出它的模块中声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57421537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com