标签: java-platform-module-system

如何在Jdk9/java-9中解决module-info.java编译错误

我试图使用jdk-9在代码下运行,但在使用命令编译时遇到问题

命令

 javac -d mods .\module-info.java com\nirav\modi\Test.java
Run Code Online (Sandbox Code Playgroud)

错误

.\module-info.java:1: error: class, interface, or enum expected
module module1 { }
^
1 error
Run Code Online (Sandbox Code Playgroud)

module-info.java

module module1 { 

}
Run Code Online (Sandbox Code Playgroud)

Test.java

package com.nirav.modi;

class Test {

    public static void main(String args[]){

        System.out.println("Hello Modular...");

    }

}
Run Code Online (Sandbox Code Playgroud)

包结构如下

module1\module-info.java
module1\com\nirav\modi\Test.java
Run Code Online (Sandbox Code Playgroud)

JDK版本

java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+153)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+153, mixed mode)
Run Code Online (Sandbox Code Playgroud)

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

6
推荐指数
2
解决办法
2370
查看次数

模块java.base不读取模块java.desktop

当我运行此测试时(使用jmockit和TestNG,不确定是否相关):

public class Test {
  @Test public void test(@Mocked ProcessBuilder pb) throws IOException {
    new Expectations() {{ pb.start(); result = null; }};
    assertNull(m());
  }

  public static Process m() throws IOException {
    return new ProcessBuilder("").start();
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

java.lang.IllegalAccessError: class java.lang.ProcessBuilder (in module java.base) cannot access class javax.print.PrintException (in module java.desktop) because module java.base does not read module java.desktop

at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java)
....
Run Code Online (Sandbox Code Playgroud)

我正在使用build 177.

我可以使用--add-reads java.base=java.desktop参数重新运行测试,它工作正常,但我真的不明白这里发生了什么.

为什么我得到那个例外?

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

6
推荐指数
2
解决办法
618
查看次数

Eclipse-添加module-info.java时找不到模块

我在eclipse中有一个简单的hello world项目,希望使用Java 9运行。该程序在没有module-info.java文件时运行,但是在添加该文件时出现以下错误:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module modulefinder not found
Run Code Online (Sandbox Code Playgroud)

重现步骤
1.创建一个新的maven项目
2.更改编译器并将jre的构建路径设置为9
3.自动生成module-info.java
4.如果eclipse抱怨,请将junit中的junit依赖关系更新为4.12
5.运行该项目

这是与月食相关的问题,还是在运行项目时丢失了某些东西?

我使用的FYI Eclipse版本是Oxygen.1a版本(4.7.1a)

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

6
推荐指数
1
解决办法
1万
查看次数

单个Maven模块中的多个Java 9模块?

我有一个有趣的担忧.我习惯了多模块Maven项目.现在我正在调查如何做同样的事情,但也使用Jigsaw.是的,每个Maven模块只能有一个Jigsaw模块吗?在IDE中,我无法在同一个Maven模块中创建第二个.

那么,到目前为止,是否有任何约定或解决方法如何组合模块的两面?

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

6
推荐指数
1
解决办法
1736
查看次数

Gradle:构建与 Java 8 兼容的模块化库

所以 Java 9 就在那里,很快就会有 Java 10。是时候让我们的库准备好在 Java 9 项目中使用了。我是通过以下方式做到的:

  1. 提供一个模块信息.java
  2. 添加的(实验)拼图插件build.gradle
  3. 根据gradle 站点上的指南手动进行更改,而不是使用 jigsaw 插件。

到目前为止,两种方法都运行良好,我可以在 Java 9 项目中使用生成的 Jar。

问题是,生成的 Jar 与 Java 8 不兼容,尽管除了module-info.java. 当我设置时targetCompatibility = 8,一条错误消息告诉我也进行相应的设置sourceCompatibility = 8。然后拒绝module-info.java我应该设置的sourceCompatibility = 9

如何解决这个问题?

我再次删除了拼图插件,并尝试了这个,但卡住了:

  1. 设置sourceCompatibility = 8targetCompatibility = 8
  2. 创建一个moduleInfo包含单个文件的新源集module-info.java
  3. 设置sourceCompatibility = 9targetCompatibility = 9为新的源集

现在编译工作了,Gradle 在尝试编译module-info.java. 但是,缺少模块(在本例中为 log4j),并且出现此错误:

:compileJava UP-TO-DATE
:processResources …
Run Code Online (Sandbox Code Playgroud)

java gradle java-platform-module-system build.gradle java-9

6
推荐指数
2
解决办法
1310
查看次数

Maven 如何与 Java 9 模块一起工作?

If I have all types of modules in my project (application, automatic and unnamed) how exactly Maven will work with them? Can I enforce Maven to treat some jars as automatic modules whereas other modules to stay in classpath. How to gradually migrate to module system with Maven?

maven java-platform-module-system java-9

6
推荐指数
1
解决办法
4226
查看次数

Java Bean Introspector需要桌面模块

我正在调查使用Jigsaw来减少微服务的占用空间.我必须找到的最后一个依赖项是java.beans.Introspector.

想象一下,当我发现我需要引入整个模块java.desktop时,我会感到惊讶,它包含各种不相关的东西,比如awt,applets,swing等.

这对我来说似乎很疯狂,当然bean内省应该是基本语言的一部分,与UI功能无关.我认为依赖来自Spring Boot的嵌入式Tomcat,所以我不能自己修改它.

问题:模块是您可以访问的最精细的粒度还是有另一种方法来修剪脂肪.

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

6
推荐指数
1
解决办法
417
查看次数

了解主类如何影响JPMS

我有一个非常基本的JavaFX应用程序,如果Application类不是 Main类,它可以完美地工作:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;

public class Main {

    public static void main(String[] args) {
        Application.launch(App.class, args);
    }

}

public class App extends Application {

    @Override
    public void start(Stage primaryStage) {
        FXMLLoader loader = new FXMLLoader(); // works
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,当我将两者合并在一起时(这是大多数教程中推荐的方式,包括OpenJFX的官方文档),模块系统抛出IllegalAccessError(至少在OpenJDK 11.0.2上):

public class MainApp extends Application {

    @Override
    public void start(Stage primaryStage) {
        FXMLLoader loader = new FXMLLoader(); // throws IllegalAccessError
    }

    public static void main(String[] args) {
        launch(MainApp.class, args);
    } …
Run Code Online (Sandbox Code Playgroud)

java javafx java-platform-module-system java-11 javafx-11

6
推荐指数
1
解决办法
103
查看次数

使OpenJDK 9+真正起作用的ScalaFX背后的魔力是什么?

环境

  • OpenJDK 64位服务器VM Zulu12.2 + 3-CA(内部版本12.0.1 + 12,混合模式,共享)
  • 斯卡拉2.12.7
  • Windows 10专业版X86_64
  • IntelliJ IDEA 2019.1.3(最终版)

scalafx-hello-worldGitHub签出了,并在IntelliJ中构建并运行了它,一切正常。这里快速介绍重要的应用程序实现:

package hello

import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.geometry.Insets
import scalafx.scene.Scene
import scalafx.scene.effect.DropShadow
import scalafx.scene.layout.HBox
import scalafx.scene.paint.Color._
import scalafx.scene.paint._
import scalafx.scene.text.Text

object ScalaFXHelloWorld extends JFXApp {

  stage = new PrimaryStage {
    //    initStyle(StageStyle.Unified)
    title = "ScalaFX Hello World"
    scene = new Scene {
      fill = Color.rgb(38, 38, 38)
      content = new HBox {
        padding = Insets(50, 80, 50, 80)
        children = …
Run Code Online (Sandbox Code Playgroud)

scala java-platform-module-system scalafx openjdk-11

6
推荐指数
2
解决办法
264
查看次数

修补模块引发模块未找到错误

我使用jdk 11并尝试了解--patch-moduleJava编译器的选项。这是我拥有的简单模块:

mdl-platform
      |
      |
      |___com.test.mdl.platform
      |            |
      |            |___ ...
      |            |
      |            |___Patch.java
      |
      |___module-info.java
Run Code Online (Sandbox Code Playgroud)

module-info.java

module com.test.mdl.plarform {
    exports com.test.mdl.platform;
}
Run Code Online (Sandbox Code Playgroud)

Patch.java

public class Patch { }
Run Code Online (Sandbox Code Playgroud)

我有Patch.java文件,想用它来修补模块。我试过了:

一世。

$ javac --patch-module com.test.mdl.platform=mdl-plarform/src/main/java/ \
                mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 
error: module not found: com.test.mdl.platform
1 error
Run Code Online (Sandbox Code Playgroud)

我还运行了一些伪造的模块路径,并且运行良好(生成了有效class文件):

二。

$ javac --patch-module com.test.mdl.platform=some/fake/path/ \
      mdl-plarform/src/main/java/com/test/mdl/platform/Patch.java 
Run Code Online (Sandbox Code Playgroud)

那么为什么第一个示例失败,但是目录存在并且包含有效目录module-info.java,但是第二个都可以正常工作,即使路径不存在?

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

6
推荐指数
1
解决办法
89
查看次数