我试图使用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) 当我运行此测试时(使用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参数重新运行测试,它工作正常,但我真的不明白这里发生了什么.
为什么我得到那个例外?
我在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)
我有一个有趣的担忧.我习惯了多模块Maven项目.现在我正在调查如何做同样的事情,但也使用Jigsaw.是的,每个Maven模块只能有一个Jigsaw模块吗?在IDE中,我无法在同一个Maven模块中创建第二个.
那么,到目前为止,是否有任何约定或解决方法如何组合模块的两面?
所以 Java 9 就在那里,很快就会有 Java 10。是时候让我们的库准备好在 Java 9 项目中使用了。我是通过以下方式做到的:
到目前为止,两种方法都运行良好,我可以在 Java 9 项目中使用生成的 Jar。
问题是,生成的 Jar 与 Java 8 不兼容,尽管除了module-info.java. 当我设置时targetCompatibility = 8,一条错误消息告诉我也进行相应的设置sourceCompatibility = 8。然后拒绝module-info.java我应该设置的sourceCompatibility = 9。
如何解决这个问题?
我再次删除了拼图插件,并尝试了这个,但卡住了:
sourceCompatibility = 8和targetCompatibility = 8 moduleInfo包含单个文件的新源集module-info.javasourceCompatibility = 9并targetCompatibility = 9为新的源集现在编译工作了,Gradle 在尝试编译module-info.java. 但是,缺少模块(在本例中为 log4j),并且出现此错误:
:compileJava UP-TO-DATE
:processResources …Run Code Online (Sandbox Code Playgroud) 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?
我正在调查使用Jigsaw来减少微服务的占用空间.我必须找到的最后一个依赖项是java.beans.Introspector.
想象一下,当我发现我需要引入整个模块java.desktop时,我会感到惊讶,它包含各种不相关的东西,比如awt,applets,swing等.
这对我来说似乎很疯狂,当然bean内省应该是基本语言的一部分,与UI功能无关.我认为依赖来自Spring Boot的嵌入式Tomcat,所以我不能自己修改它.
问题:模块是您可以访问的最精细的粒度还是有另一种方法来修剪脂肪.
我有一个非常基本的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) 环境:
我scalafx-hello-world从GitHub签出了,并在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) 我使用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-platform-module-system ×10
java ×8
java-9 ×8
java-module ×2
maven ×2
build.gradle ×1
eclipse ×1
gradle ×1
java-11 ×1
javafx ×1
javafx-11 ×1
jmockit ×1
openjdk ×1
openjdk-11 ×1
scala ×1
scalafx ×1