Java 9计划不久(7月27日)发布。是否有计划发布将模块化的Spring项目的Java 9兼容版本(Java 9项目Jigsaw)?
spring java-platform-module-system spring-boot java-9 java-module
我有两个模块:模块a和模块b。模块-a具有属性文件(com/foo/texts_en.properties)。Module-a出口com.foo包装。在模块b中,我想获取此资源。为此,我在模块b中执行以下操作:
Module moduleA = ClassFromModuleA.class.getModule();
ResourceBundle resourceBundle = ResourceBundle.getBundle("com/foo/texts",
Locale.ENGLISH, moduleA.getClassLoader());
System.out.println("TEST :" + resourceBundle.getString(key);
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
Caused by: java.util.MissingResourceException: Can't find bundle for base name com/foo/texts, locale en
at java.base/java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:2045)
at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1679)
at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1572)
at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:1273)
Run Code Online (Sandbox Code Playgroud)
我怎么了
我一直在使用Java中的简单自定义类加载器,到目前为止,一切都按预期用于非模块相关类.但是,我似乎无法找到使用我的类加载器从模块加载类的任何方法,即使模块相关的find*()方法已经重载.我试图做的是从模块"HelloModularWorld"加载一个类并运行它的主要.但是,当我指定包所在的目录时,它会"正常"加载并报告为未命名的模块.我错过了什么?
类加载器只是从文件系统的其他地方加载类,没什么特别的.
类加载器实现:
package arch.classloaders;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
public class ModifiableClassLoader extends ClassLoader {
private File searchPath;
//...other ctors...
public ModifiableClassLoader(File path, String name, ClassLoader parent) {
super(name, parent); //Delegate to parent classloader as required.
if (!path.isDirectory()) throw new IllegalArgumentException("Path must be a directory");
searchPath = path;
}
public void setPath(File newPath) {...}
public File getPath() {...}
//Responsible for actual loading
public Class<?> findClass(String binName) throws ClassNotFoundException {
File classfile = new File(searchPath.getPath() + File.separator …Run Code Online (Sandbox Code Playgroud) java classloader java-platform-module-system java-9 java-module
如何在启动应用程序时了解已解析的模块列表,以便确定从根模块可以访问的所有服务提供程序.
我是否需要main在模块内或外部运行我的方法?
我是使用Java模块化系统的新手.我正在尝试使用Java 10中的JavaFX创建一个简单的程序,因为它是支持JavaFX的Java的最后一个版本.
我在module-info.javaJavaFX 上导入了必要的依赖项,它只显示了一个简单的窗口.
sample.fxml 码:
<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="com.gui.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>
Run Code Online (Sandbox Code Playgroud)
当我构建我的代码时,它说:
Warning:(4, 27) java: module not found: com.main
Run Code Online (Sandbox Code Playgroud)
当我尝试运行我的代码时,我得到:
Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Run Code Online (Sandbox Code Playgroud)
任何人都可以为此提供建议,或者以某种方式提供有关使用模块化系统创建项目的实际应用建议.
我在下面附上了一对截图.
建立警告:
运行时失败:
我正在尝试在Mac OS上运行示例JavaFX应用程序.
的build.gradle
apply plugin: 'java'
apply plugin: 'application'
repositories {
mavenCentral()
}
dependencies {
compile "org.openjfx:javafx-base:11"
compile "org.openjfx:javafx-graphics:11"
compile "org.openjfx:javafx-controls:11"
}
compileJava {
doFirst {
println "CLASSPATH IS $classpath.asPath"
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.graphics'
]
classpath = files()
}
}
Run Code Online (Sandbox Code Playgroud)
Java类
package com.test;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX …Run Code Online (Sandbox Code Playgroud) 我使用 Java 11.0.1中的Project Jigsaw研究了一个简单的示例,该示例是在Ubuntu 18.04上使用oracle JDK 11构建的。
在该示例之后,我创建了一个简单的项目,该项目可编译为模块,将该模块打包到jar中,然后用于jlink创建独立发行版。一切正常-最终结果是一个很小的文件夹,其中包含简化的JRE和我的模块。
该项目仅由三个文件和一些文件夹组成:
.:
build.sh src
./src:
com module-info.java
./src/com:
greetings
./src/com/greetings:
Main.java
Run Code Online (Sandbox Code Playgroud)
src / com / greetings / Main.java
package com.greetings;
public class Main {
public static void main(String[] args) {
System.out.println("Greetings!");
}
}
Run Code Online (Sandbox Code Playgroud)
src /模块信息.java
module com.greetings { }
Run Code Online (Sandbox Code Playgroud)
build.sh
#/bin/bash
#clean up from last build
rm -rf greetingsapp mlib mods
#compile
javac -d mods/com.greetings src/module-info.java src/com/greetings/Main.java
#Make module jar
mkdir mlib
jar …Run Code Online (Sandbox Code Playgroud) 我正在尝试Java模块系统。我正在尝试将ServiceLoader用于通用接口。它可以工作,但是我在module-info中收到警告。这是我的最小代码
module testProvideWith {
provides ServiceGeneric with SString;
uses ServiceGeneric;
}
public interface ServiceGeneric<T> {
T getT();
}
public class SString implements ServiceGeneric<String>{
public String getT() {return "Hello";}
}
Run Code Online (Sandbox Code Playgroud)
尝试时收到警告我并不感到惊讶
ServiceGeneric<String> serv=ServiceLoader.load(ServiceGeneric.class).findFirst().get();
Run Code Online (Sandbox Code Playgroud)
我知道通用擦除,我知道我必须使用注释或其他技巧来注释正确的服务。但是...我没有找到所有通用服务。我希望能够写类似
module testProvideWith {
provides ServiceGeneric<String> with SString;
uses ServiceGeneric<String>;
//more cases could be added
}
...
ServiceLoader.load(ServiceGeneric.class,String.class)
Run Code Online (Sandbox Code Playgroud)
模块和加载程序在哪里协作以跟踪可用的通用版本..但是...什么都没有...没有人考虑过这种可能性...我想念什么吗?
背景:从Java 9开始,可以使用jlink创建自定义运行时映像(JRE + program)。
可以使用prunsrv.exe(Apache Commons Daemon的一部分)将Java程序作为Windows服务安装。
prunsrv可用于三种启动模式:java,jvm和exe。
我设法使用exe模式启动了自定义运行时映像,并使用jvm模式启动了传统的Java程序(类路径+普通JDK),但无法在映像中使用jvm模式(不会启动新进程) 。
prunsrv具有一个“ JvmOptions9 ”参数,这可能暗示可能支持此方案,但我不确定。
我在Java 9之前构建了一个jar。我正在尝试使用Java 9运行该jar中的类。
从我读到的有关自动模块的所有内容来看,这应该可以工作:
java -p lib/Legacy-1.3.0.jar -m Legacy/com.blah.MyClass
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个:
Error: Unable to initialize main class com.blah.MyClass in module module Legacy
Caused by: module Legacy: java.lang.NoClassDefFoundError
Run Code Online (Sandbox Code Playgroud)
是的,com.blah.MyClass是旧版。我可以从自动模块中运行课程吗?为什么module在上面的错误消息中单词重复两次?
如果我跑步,java --list-modules -p lib/Legacy-1.3.0.jar我会看到:
Legacy@1.3.0 file://path/to/jar/Legacy-1.3.0.jar automatic
Run Code Online (Sandbox Code Playgroud)
如果我跑步jdeps --generate-module-info . lib/Legacy-1.3.0.jar,我得到:
module Legacy {
requires java.logging;
requires transitive java.activation;
requires transitive java.xml;
requires transitive java.xml.bind;
requires transitive java.xml.ws;
exports com.blah;
}
Run Code Online (Sandbox Code Playgroud) java-module ×10
java ×8
java-9 ×6
java-11 ×2
java-platform-module-system ×2
javafx ×2
jlink ×2
classloader ×1
generics ×1
gradle ×1
java-10 ×1
java-12 ×1
javac ×1
module-info ×1
prunsrv ×1
spring ×1
spring-boot ×1