标签: java-module

如何从 Java 9 中新创建的层中的模块调用服务?

我有三个模块:模块-a、模块-b、模块-c。Module-a 和 module-b 位于引导层。module-c 层我自己创建。

Module-a 有一个接口com.mod-a.Service,在它的 module-info 中我有:

module module-a {
    exports com.mod-a;
}
Run Code Online (Sandbox Code Playgroud)

Module-c 实现com.mod-a.Service并在其模块信息中我有:

module module-c {
    requires module-a;
    provides com.mod-a.Service with com.mod-c.ServiceImpl;
}
Run Code Online (Sandbox Code Playgroud)

模块-b 使用模块-c 创建新层,并调用模块-c 服务。在它的模块信息中,我有:

module module-b {
    requires module-a;
    requires java.management;
    requires slf4j.api;
    uses com.mod-a.Service;
}
Run Code Online (Sandbox Code Playgroud)

在 module-b 中,我使用 module-c 以这种方式创建新层:

ModuleFinder finder = ModuleFinder.of(moduleCPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("module-c"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl);
//the following line prints "module-c" …
Run Code Online (Sandbox Code Playgroud)

java java-9 java-module

5
推荐指数
1
解决办法
283
查看次数

ResolvedModule、Module 和 Observable Module 有什么区别

这些状态中的每一个的文档如下:

ResolvedModule

已解析模块图中的模块。ResolvedModule定义了配置方法来获取解析模块所在的配置。它定义了引用方法来获取对模块内容的引用。

Module

表示一个运行时模块,命名或未命名

问:- 这两者什么时候不同,是在编译时还是运行时,还是只是模块的不同表示?

另一方面,模块路径定义

编译时或运行时环境中内置的模块,连同那些由模块路径上的工件定义的模块,统称为可观察模块的宇宙。

问:- 所有这些都相关吗?有人可以举例说明如何以及在什么时间解释这个概念吗?

java java-platform-module-system java-9 java-module

5
推荐指数
1
解决办法
249
查看次数

module-info.java 不适用于 Java 9 中的 lombok

我在将项目迁移到Java 9 时遇到了问题

更新 Java 9 后,我尝试运行项目,但遇到编译器错误:-

Error:(6, 1) java: package javax.annotation is not visible 
(package javax.annotation is declared in module java.xml.ws.annotation, which is not in the module graph) 
Run Code Online (Sandbox Code Playgroud)

但我找到了解决方法。我添加了lombok.config文件。

然后将module-info.java文件添加到项目编译器后再次显示错误

Error:(10, 26) java: variable title not initialized in the default constructor
Run Code Online (Sandbox Code Playgroud)

项目示例:

我们有实体Store

@AllArgsConstructor
@Getter
public class Story {
    private final String title;
}
Run Code Online (Sandbox Code Playgroud)

在 root 的包中,我有module-info.java内容:

module javanine {
    requires lombok;
}
Run Code Online (Sandbox Code Playgroud)

在 root 的项目中,我有 lombok.config …

lombok java-9 java-module module-info

5
推荐指数
2
解决办法
4462
查看次数

未命名模块与 ServiceLoader::load 的命名模块交互

我有一个这样的项目:

\---main
    \---src
        \---com.foo
            \---UnnamedStart.java
\---api
    \---src
        \---com.foo.api
            \---ApiInterface.java
        \---module-info.java
\---impl
    \---src
        \---com.foo.impl
            \---ApiInterfaceImpl.java
        \---module-info.java
Run Code Online (Sandbox Code Playgroud)

的实现UnnamedStart.java是:

public static void main(String[] args) {
    ServiceLoader<ApiInterface> services = ServiceLoader.load(ApiInterface.class);
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,main是未命名的模块。

api/src/module-info.java 是:

module com.foo.api {
     exports com.foo.api;
}
Run Code Online (Sandbox Code Playgroud)

并且impl/src/module-info.java是:

更新 1.1 - 下面的代码更新见评论,添加requires

更新 1.2 - 下面的代码已更新,在创建问题时provides A with B更改为provides B with A错误,原本没问题

module com.foo.impl {
     requires com.foo.api; //added (update 1.1)
     provides com.foo.impl.ApiInterface
         with com.foo.api.ApiInterfaceImpl; //vice versa (update 1.2)
} …
Run Code Online (Sandbox Code Playgroud)

java java-9 java-module module-info

5
推荐指数
1
解决办法
7076
查看次数

Java 9 如何运行使用非导出包的 Java 8 编译的代码

我使用 Java-8 编译器编译了以下代码:

package pack;
import sun.util.calendar.CalendarUtils;
public class A {
    public static void main(String[] args) {
        System.out.println(CalendarUtils.isGregorianLeapYear(2018));
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用 Java-8 编译器将上述代码编译为:

gyan@gyan-pc:~/codes/java$ ~/Documents/softwares/Linux/jdk1.8.0_131/bin/javac -d . a.java
a.java:2: warning: CalendarUtils is internal proprietary API and may be removed in a future release
import sun.util.calendar.CalendarUtils;
                        ^
a.java:9: warning: CalendarUtils is internal proprietary API and may be removed in a future release
        System.out.println(CalendarUtils.isGregorianLeapYear(2018));
                           ^
2 warnings
Run Code Online (Sandbox Code Playgroud)

我的默认 Java 解释器的版本:

gyan@gyan-pc:~/codes/java$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11) …
Run Code Online (Sandbox Code Playgroud)

java java-9 java-module

5
推荐指数
1
解决办法
293
查看次数

即使显式提供模块路径,Eclipse也找不到模块

我创建了一个com.company.ep位于源文件夹中的模块com.company.ep(是的,我已从srcBuild Path中删除并删除它).在源文件夹中,我有几个包如下:

com.company.ep    <--- root source folder
    com.company.ep.main    <--- package 1
    com.company.ep.model   <--- package 2
    com.company.ep.view    <--- package 3
    // ... more packages
    module-info.java
Run Code Online (Sandbox Code Playgroud)

主类位于包中com.company.ep.main.Main.在我的module-info.java配置依赖项:

module com.company.ep {
    exports com.company.ep.main;
    exports com.company.ep.model;
    exports com.company.ep.view;
    // ... more exports
    requires javafx.controls;
    requires javafx.graphics;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试启动我的程序时,Eclipse告诉我:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found, required by com.company.ep
Run Code Online (Sandbox Code Playgroud)

所以我尝试在命令提示符下运行它:

java -p d:\Applications\openjfx-sdk-11\lib;bin -m com.company.ep/com.company.ep.main.Main

bin是Eclipse的输出文件夹,它工作.

所以我去了 …

java eclipse javafx java-module javafx-11

5
推荐指数
1
解决办法
2703
查看次数

在 Gradle 中编译一个 JDK 8 项目 + 一个 JDK 9 “module-info.java”

我正在开发一个面向 JDK 8 的 Java 库,我正在使用 OpenJDK 11 在 Gradle 5 中构建它。为了面向 JDK 8,我是 javac 的--release选项。

但是,我也希望我的库与 JPMS 兼容。换句话说:

MCVE

构建.gradle

plugins {
    id 'java'
    id 'org.javamodularity.moduleplugin' version '1.4.1' // *
}

repositories {
    mavenCentral()
}

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.6'
}

compileJava.options.compilerArgs.addAll(['--release', '9']) // **
Run Code Online (Sandbox Code Playgroud)

*org.javamodularity.moduleplugin设置--module-pathcompileJava

** 目前还没有 Gradle DSL --release#2510

src/main/java/module-info.java: …

java javac gradle java-9 java-module

5
推荐指数
1
解决办法
3485
查看次数

模棱两可的模块调用

我正在尝试在 JAVA11 中重新编译 JAVA8 代码。获得以下编译错误。

错误:对模块的引用不明确 private Module module; ,com.module 中的接口 com.module.Module 和 java.lang 中的类 java.lang.Module 匹配

刚接触 Java 无法完全理解根本原因。任何信息都会有很大帮助。

java java-platform-module-system java-8 java-module java-11

5
推荐指数
1
解决办法
1905
查看次数

当JRE作为单独的产品完全停产时?

从Java 9开始,引入了模块系统,从而使JRE的单独提供变得多余

通过,似乎仍然可以下载它。例如,现在从这里开始Java 9存档 此外,这里仅指出:

重组JDK和JRE运行时映像,以明确区分开发人员,部署人员和最终用户可以依赖并适当修改的文件,与实现内部的文件相反,这些文件可以更改而无需更改注意。

新的映像结构消除了这种区别:JDK映像只是运行时映像,恰好包含JDK历史上发现的全套开发工具和其他项目。

因此,没有谈论彻底清除。来自:jdk-9

当您安装jdk-9时,public jre-9也将自动安装。

另外,我还以为从Java 9开始就应该始终使用jlink创建自定义运行时,但是现在看来似乎只从Java 11开始执行。从Java 11的发行说明中可以看出,Oracle JDK发行说明

在Windows和macOS中,安装早期版本中的JDK可以选择安装JRE。在JDK 11中,这不再是一个选项。在此版本中,不再提供JRE或Server JRE。仅提供JDK。用户可以使用jlink创建较小的自定义运行时。

但是随后我可以找到很多类似的讨论:

是这种情况,并且从Java 11开始就无法直接下载JRE ?还是在Oracle和OpenJDK之间混合实现?还是上述讨论引起误解?

编辑:我不需要下载jre,我可以通过jlink创建它或使用已经可用的解决方案,我的问题更多是理论上的

java jlink java-9 java-module java-11

5
推荐指数
2
解决办法
678
查看次数

在模块源路径中找不到模块 moduleA ,正在尝试编译

在回答这个问题后,我在 Github 上发布了 Java 9 模块教程 + 示例以及如何为未来用户运行:

我有以下非常简单的结构:

src 
?   module-info.java
? 
????moduleA
    ????pack1
            Main.java
Run Code Online (Sandbox Code Playgroud)

module-info.java :

module moduleA {

}
Run Code Online (Sandbox Code Playgroud)

Main.java

package moduleA.pack1;
public class Main{

 public static void main(String[] args){
   System.out.println("Hello Java 11");
 }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编译然后运行这个非常简单的模块化 java 应用程序。

所以从我运行的 cmd 开始:

编译

javac --module-source-path src -d out -m moduleA
Run Code Online (Sandbox Code Playgroud)

java  --module-path out -m moduleA/pack1.Main
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

从 IntelliJ 开始,它的作用就像魅力一样,我不知道它背后有什么魔力。

我做错了什么?

java modularity java-module java-11

5
推荐指数
1
解决办法
876
查看次数