标签: java-module

Spring项目的Java 9 Jigsaw(模块)有什么计划?

Java 9计划不久(7月27日)发布。是否有计划发布将模块化的Spring项目的Java 9兼容版本(Java 9项目Jigsaw)?

spring java-platform-module-system spring-boot java-9 java-module

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

如何从Java 9中的另一个模块获取ResourceBundle?

我有两个模块:模块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 java-9 java-module

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

使用自定义类加载器从爆炸模块加载类

我一直在使用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

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

列出应用程序启动期间解析的模块

如何在启动应用程序时了解已解析的模块列表,以便确定从根模块可以访问的所有服务提供程序.

java java-9 java-module module-info

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

主方法不在模块内运行

我是否需要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)

任何人都可以为此提供建议,或者以某种方式提供有关使用模块化系统创建项目的实际应用建议.

我在下面附上了一对截图.

建立警告:

在此输入图像描述

运行时失败:

在此输入图像描述

java javafx java-10 java-module

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

Gradle for Java 11 with Modules

我正在尝试在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 javafx gradle java-module java-11

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

依赖于外部jar的编译模块

使用 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 javac jlink java-module java-11

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

Java模块系统:“提供”通用接口

我正在尝试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 generics java-module java-12

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

是否可以使用jvm模式使用prunsrv启动Java运行时映像?

背景:从Java 9开始,可以使用jlink创建自定义运行时映像(JRE + program)。

可以使用prunsrv.exeApache Commons Daemon的一部分)将Java程序作为Windows服务安装。

prunsrv可用于三种启动模式:javajvmexe

我设法使用exe模式启动了自定义运行时映像,并使用jvm模式启动了传统的Java程序(类路径+普通JDK),但无法在映像中使用jvm模式(不会启动新进程) 。

prunsrv具有一个“ JvmOptions9 ”参数,这可能暗示可能支持此方案,但我不确定。

jlink apache-commons-daemon java-9 prunsrv java-module

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

Java 9:运行旧版jar

我在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 java-9 java-module

5
推荐指数
0
解决办法
109
查看次数