我的Java库应该与Java 8和Java 9兼容.对于使用Java 9运行,我们需要一些Java 9模块.
我知道我可以通过命令行添加它--add-modules
.但它是一个库,我无法控制命令行.
是否有一个等价--add-modules
的MANIFEST.MF
?或者还有其他与Java 8兼容的解决方案吗?
我已经创建了我非常确定的模块化jar文件.但如果可能的话,我想仔细检查一下.给定一个jar文件,有没有办法确定编译器会在其中找到哪些模块?
现在,对于我拥有的每个模块,我需要明确指定要导出的包.例如:
module core {
exports cc.blynk.server.core;
exports cc.blynk.server.core.protocol.handlers.decoders;
exports cc.blynk.server.core.protocol.handlers.encoders;
}
Run Code Online (Sandbox Code Playgroud)
但是,它不是很方便.我想做那样的事情:
module core {
exports cc.blynk.server.core.*;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?这种限制来自哪里?
我创建了一个简单的测试用例来测试Java 9 Web Start的新模块.遗憾的是,Java 9 Web Start默认情况下不支持像常规Java 9那样的--permit-illegal-access.
Java 9 Web Start假设支持--add-opens(请参阅https://bugs.openjdk.java.net/browse/JDK-8172986).
我正在使用Java 1.9.0_181_ea.
这是我的测试类:
import java.awt.Toolkit;
import java.lang.reflect.Method;
import java.lang.IllegalAccessException;
import java.lang.reflect.InvocationTargetException;
public class Java9BreaksWhenTest {
public static void main(String args[]) throws IllegalAccessException, InvocationTargetException {
System.out.println("Hello World");
// Do some dangerous reflection
Toolkit toolkit = Toolkit.getDefaultToolkit();
Class c = toolkit.getClass();
while(true) {
Method m = null;
try {
m = c.getDeclaredMethod("setDesktopProperty", String.class, Object.class);
} catch (NoSuchMethodException ex) {
c = c.getSuperclass();
if (c!=null)
continue;
} catch (SecurityException …
Run Code Online (Sandbox Code Playgroud) 是否可以在模块路径上拥有2个具有完全相同名称(但内容略有不同)的模块?
据我所知,Java 9编译器并没有抱怨它.我有2个模块声明如下:
module com.dj.helper {
exports com.dj.helper;
}
Run Code Online (Sandbox Code Playgroud)
两者都包含com.dj.helper
包,但在包内的内容是不同的.然后在我的主应用程序中,我想要导入此模块:
module com.dj {
requires com.dj.helper;
}
Run Code Online (Sandbox Code Playgroud)
具有相同名称的两个模块都在我的模块路径上.
我希望在编译我的com.dj
模块时,编译器会抱怨同一模块存在两次,但事实并非如此.这是否有效地意味着您可以在模块路径上拥有相同jar的2个版本,而Java将不知道使用哪个版本?
当我在SpringBoot代码中引入java 9模块时,我得到了大量的"拆分包"错误.它们无处不在,例如:
Error:java: the unnamed module reads package org.bson.types from both bson and mongodb.driver
Error:java: the unnamed module reads package org.bson.io from both bson and mongodb.driver
Error:java: the unnamed module reads package org.bson from both bson and mongodb.driver
Error:java: the unnamed module reads package com.mongodb.client.model from both mongodb.driver.core and mongodb.driver
Error:java: the unnamed module reads package com.mongodb.client from both mongodb.driver.core and mongodb.driver
Error:java: the unnamed module reads package com.mongodb from both mongodb.driver.core and mongodb.driver
Error:java: the unnamed module reads package …
Run Code Online (Sandbox Code Playgroud) 我创建了一个具有以下结构的多模块项目
myproject
|- mymodule
|- src
|- main
|- java
|- com
|- mymodule
|- Util.java
|-newmodule
|-src
|-main
|-java
|-com
|-newmodule
|- Main.java
|-module-info.java
Run Code Online (Sandbox Code Playgroud)
现在我想使用 Util.java,它是模块化模块 newmodule 中的非模块化代码。我已经在 newmodule 中声明了以下内容
module newmodule {
requires mymodule;
}
Run Code Online (Sandbox Code Playgroud)
项目编译正常,但 Intellij 显示模块未找到并且包 com.mymodule 在未命名模块中声明,模块“newmodule”不读取它。
如何解决这个问题?
还有一个问题,如果我什至不模块化遗留模块,所有旧的非模块化代码是否在默认情况下都会变成 java 9 中的自动模块?
我按照步骤创建了 HelloWorld 示例,但它没有运行。它给出了以下错误:
启动层初始化时出错 java.lang.module.FindException: Error reading module: F:\Develop\eclipse\HelloWorld\bin Caused by: java.lang.module.InvalidModuleDescriptorException: HelloWorld.class found in top-level directory (模块中不允许使用未命名的包)”
我开始学习 jigsaw java-9 功能并阅读了一些文章/视频。
我无法理解可选依赖项的概念(requires static
)
引自文章:
当一个模块需要针对另一个模块的类型进行编译但不想在运行时依赖它时,它可以使用 requires static 子句。如果 foo 需要 static bar,则模块系统在编译和运行时的行为会有所不同:
在编译时, bar 必须存在,否则会出错。在编译期间 bar 可由 foo 读取。
在运行时, bar 可能不存在,这不会导致错误或警告。如果它存在,它可以被 foo 读取。
所以我想知道几件事:
在编译时使模块依赖于另一个模块而不是运行时的原因是什么?任何例子?像龙目岛这样的乐器?
java之前的java-9中可选依赖项的任何类似物?
我找到了另一种解释:引自文章:
有时我们编写引用另一个模块的代码,但我们库的用户永远不想使用。
例如,我们可能会编写一个实用程序函数,当另一个日志模块存在时,它可以漂亮地打印我们的内部状态。但是,并非我们库的每个使用者都需要此功能,并且他们不想包含额外的日志记录库。
在这些情况下,我们希望使用可选的依赖项。通过使用 requires 静态指令,我们创建了一个仅编译时依赖:
module my.module {
requires static module.name;
}
Run Code Online (Sandbox Code Playgroud)
但对我来说完全不清楚。谁能用简单的方式解释一下?
使用JDK/11的早期访问构建来编译基于使用VM参数的Java-9的现有代码
--add-modules jdk.incubator.httpclient
Run Code Online (Sandbox Code Playgroud)
解决HTTP/2客户端孵化器模块 现在最终出现编译错误
找不到模块:jdk.incubator.httpclient
Java版本详细信息: -
Run Code Online (Sandbox Code Playgroud)java 11-ea 2018-09-25 Java(TM) SE Runtime Environment 18.9 (build 11-ea+11) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-ea+11, mixed mode)
java ×10
java-module ×10
java-9 ×8
java-platform-module-system ×2
eclipse ×1
http2 ×1
java-11 ×1
jnlp ×1
migration ×1
module-info ×1
spring ×1
spring-boot ×1