我想在我的应用程序中使用Java 9。我的一个依赖项有一个jar名称:
sdk-http-ahc-2_0
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试将其更改为自动模块时,该模块的名称无效。
requires sdk.http.ahc.2_0; // not valid
Run Code Online (Sandbox Code Playgroud)
我在命名模块时缺少什么吗?我在这里还有其他选择吗?
在 Java 9 中,我可以跨模块拆分子包吗?例如,我可以com.example.foo在一个模块中同时com.example.foo.bar在另一个模块中吗?
这似乎是一个简单的问题,但由于某种原因,我在搜索后无法找到直接答案。权威的参考将不胜感激。
我假设我可以在不同的模块中拥有同级子包,例如com.example.foo和com.example.other。
我采用了一个使用maven-surefire-plugin(自动测试)来触发 JMH 基准测试的项目并将其添加module-info.java到其中。现在,META-INF/BenchmarkList不再生成(实际上,整个目录都丢失了)所以我在启动基准测试时最终出现以下错误:
ERROR: Unable to find the resource: /META-INF/BenchmarkList
我怀疑 Java 模块会阻止注释处理器正常运行,但我不知道如何修复它。有任何想法吗?
我试图在一个简单的java项目中使用swing API,其中需要在module-info.java中导入javax.swing包
我在 Eclipse IDE 上使用 openJDK-11
module ml.garba.testeur {
requires javax.swing;
}
Run Code Online (Sandbox Code Playgroud)
这是 JFrame 实例
package ml.garba.testeur.vue;
import javax.swing.JFrame;
public class Fenetre_Testeur extends JFrame {
}
Run Code Online (Sandbox Code Playgroud)
似乎swing 包的导入不起作用。
我需要帮助
当我试图在我的自定义 JRE 中找到需要链接的 Java 模块时,我确实从jdeps工具中获得了一个 NPE :
marc$ jdeps --module-path $JAVA_HOME/jmods --print-module-deps --multi-release 11 target/blha/jx1-0.0.1-SNAPSHOT/BOOT-INF/lib/*.jar
Exception in thread "main" java.lang.NullPointerException
at jdk.jdeps/com.sun.tools.jdeps.ModuleGraphBuilder.requiresTransitive(ModuleGraphBuilder.java:124)
at jdk.jdeps/com.sun.tools.jdeps.ModuleGraphBuilder.buildGraph(ModuleGraphBuilder.java:110)
at jdk.jdeps/com.sun.tools.jdeps.ModuleGraphBuilder.reduced(ModuleGraphBuilder.java:65)
at jdk.jdeps/com.sun.tools.jdeps.ModuleExportsAnalyzer.modules(ModuleExportsAnalyzer.java:124)
at jdk.jdeps/com.sun.tools.jdeps.ModuleExportsAnalyzer.run(ModuleExportsAnalyzer.java:97)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask$ListModuleDeps.run(JdepsTask.java:1023)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:560)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:519)
at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)
Run Code Online (Sandbox Code Playgroud)
知道如何找到我需要链接到此 Spring Boot 项目的自定义 JRE 的所有模块吗?
JPMS 模块名称中不允许使用破折号。据我了解,建议用点替换它们。
但是,我找不到带有替换建议的 Java 模块名称中其他不允许的字符的列表。例如,是否允许使用“_”字符?
public class Product{
private String id;
private String name;
private String description;
// Getters and setters..
}
Run Code Online (Sandbox Code Playgroud)
从上面的类中,我想在运行时获取描述的字段名称:
Query query = new Query();
if (productSearchCriteria.getDescription().isPresent()) {
query.addCriteria(Criteria.where("description").is(productSearchCriteria.getDescription().get()));
}
Run Code Online (Sandbox Code Playgroud)
目前,我已经对名称进行了硬编码,但它应该是动态的,因为如果有人重命名或更改属性名称,这将不起作用。
环顾四周,我发现了一个reflection-util库。
String numberProperty = PropertyUtils.getPropertyName(Product.class, Product::getDescription);
Run Code Online (Sandbox Code Playgroud)
这给了我一个例外:
Caused by: java.lang.ClassCastException: class domain.Product$ByteBuddy$QIcFk1aK cannot be cast to class domain.Product (domain.Product$ByteBuddy$QIcFk1aK is in unnamed module of loader net.bytebuddy.dynamic.loading.ByteArrayClassLoader @33943b71; domain.Product is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @5be4b0e6)
at de.cronn.reflection.util.PropertyUtils.findMethodByGetter(PropertyUtils.java:322) ~[reflection-util-2.6.0.jar:na]
at de.cronn.reflection.util.PropertyDescriptorCache.lambda$getMethod$4(PropertyDescriptorCache.java:178) ~[reflection-util-2.6.0.jar:na]
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[na:na]
at de.cronn.reflection.util.PropertyDescriptorCache.getMethod(PropertyDescriptorCache.java:178) ~[reflection-util-2.6.0.jar:na]
at …Run Code Online (Sandbox Code Playgroud) 有一个具有标准 Maven 文件夹结构的简单 Java 项目。
src
main
java
mypackage
Main.java
resource
abc
cde.txt
Run Code Online (Sandbox Code Playgroud)
Main.java(省略样板)
var path = "abc/cde.txt";
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
if (input == null) {
throw new IllegalStateException("Resource not found");
} else {
// read from input
}
Run Code Online (Sandbox Code Playgroud)
该代码工作正常并从绝对路径
"%project_root%/target/classes/abc/cde.txt"(编译后的代码)读取文件。
添加文件后src/main/java/module-info.java情况发生变化:程序找不到文件并抛出in branch (input == null)。
如何以旧方式从“资源”文件夹中读取文件并同时拥有:资源文件夹中的java模块和资源?我想避免"src/main/resources"到处添加前缀。
我开始研究模块,我想尝试“需要传递”。所以我为界面创建了一个模块:
module interfacesModule {
exports com.my.interfaces;
}
Run Code Online (Sandbox Code Playgroud)
有 1 个接口:
package com.my.interfaces;
public interface MyInterface {
void go();
}
Run Code Online (Sandbox Code Playgroud)
一个实现模块:
module javaModuleA {
requires interfacesModule;
exports com.my.moduleA;
}
Run Code Online (Sandbox Code Playgroud)
班级:
package com.my.moduleA;
import com.my.interfaces.MyInterface;
public class ClassA implements MyInterface {
public void go() {
System.out.println("in class A");
}
}
Run Code Online (Sandbox Code Playgroud)
和主模块:
module mainModule {
requires transitive javaModuleA;
requires interfacesModule; // this line I want to comment, to use from requires transitive
}
Run Code Online (Sandbox Code Playgroud)
班级:
package com.my;
import com.my.interfaces.MyInterface;
import com.my.moduleA.ClassA;
public class Main …Run Code Online (Sandbox Code Playgroud) 如何java.lang.Module通过Java 9中的字符串名称获取?
例如,我们有
String name = "some.module";
Module module = //how to get here it?
Run Code Online (Sandbox Code Playgroud) java-module ×10
java ×9
java-9 ×4
java-11 ×2
classloader ×1
java-14 ×1
java-platform-module-system ×1
jmh ×1
maven ×1
module ×1
resources ×1
spring ×1
swing ×1