我有一个简单的Maven项目:
src
??? main
??? java
??? module-info.java
pom.xml
Run Code Online (Sandbox Code Playgroud)
pom.xml中:
<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>10</release>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
当我通过构建项目时mvn -X install -DskipTests=true,它失败了:
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project example: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) …Run Code Online (Sandbox Code Playgroud) 需求和需要模块声明中的传递模块语句有什么区别?
例如:
module foo {
requires java.base;
requires transitive java.compiler;
}
Run Code Online (Sandbox Code Playgroud) 所以这是我的问题...
我正在使用 maven-shade 插件将 Spring Boot 应用程序打包到 uber jar 中。很简单吧?好吧,除了最近我在结尾处收到以下警告mvn clean package:
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
这实际上并没有破坏任何东西,但我是一个完美主义者,这让我发疯了吗?我该如何摆脱它?我尝试了很多东西,但没有成功。
请帮忙 :(
模块与open关键字之前和之后有什么区别?
例如:
open module foo {
}
module foo {
}
Run Code Online (Sandbox Code Playgroud) 我的项目依赖于Netty Epoll传输.这是依赖:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
<version>${netty.version}</version>
<classifier>${epoll.os}</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)
此依赖项的自动生成的模块名称为:
netty.transport.native.epoll
Run Code Online (Sandbox Code Playgroud)
由于native关键字是在Java 9中保留的,我无法将此模块作为依赖项添加到我的项目中:
module core {
requires netty.transport.native.epoll;
}
Run Code Online (Sandbox Code Playgroud)
由于:
module not found: netty.transport.<error>
Run Code Online (Sandbox Code Playgroud)
此外,jar工具--describe-module报告以下内容:
无法导出模块描述符:网状输送本地-epoll的-4.1.17.Final-快照Linux的x86_64.jar netty.transport.native.epoll:无效的模块名称:"天然"是不是Java标识符
有没有解决方法?(当然,除了"发布正确的网络工件").
编辑:
作为维护者的快速修复 - 您可以添加下一行来构建:
<manifestEntries>
<Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
Run Code Online (Sandbox Code Playgroud) 需求和需要模块声明中的静态模块语句有什么区别?
例如:
module bar {
requires java.compiler;
requires static java.base;
}
Run Code Online (Sandbox Code Playgroud) 在Java 9中,是否允许使用循环模块?如果不是,原因是什么?
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.fizz;
}
module com.foo.baz {
requires com.foo.bar;
exports com.foo.baz.buzz;
}
Run Code Online (Sandbox Code Playgroud) java java-platform-module-system java-9 java-module module-info
在Java 9的模块声明中有2个结构:
exports com.foo;
Run Code Online (Sandbox Code Playgroud)
和
opens com.foo;
Run Code Online (Sandbox Code Playgroud)
凡exports赠款编译时访问,同时opens允许运行时访问,如反射和资源.
opens有一个宽容exports,你可以将整个模块定义为open,结果与显式打开每个包相同:
open module com.mod {
Run Code Online (Sandbox Code Playgroud)
但是没有相似的结构
exported module com.mod {
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么会这样; 有什么决定允许一次打开整个模块而不是出口?
java java-platform-module-system java-9 java-module module-info
java doc中的ModifierforExports表明了这一点
MANDATED导出在模块声明的源中隐式声明.
SYNTHETIC未在模块声明的源中显式或隐式声明导出.
看几个module-info.classes,我可以看到通常有两种类型的用法:
module java.base {
...
exports java.util; // type 1
exports java.util.concurrent;
exports java.util.concurrent.atomic;
exports jdk.internal to jdk.jfr; // type 2
exports jdk.internal.jmod to
jdk.compiler,
jdk.jlink;
...
}
Run Code Online (Sandbox Code Playgroud)
在合格的出口做介绍这两种,但没有对枚举类型没有提及.这些是文档中提到的不同类型吗?
Q1.一般来说SYNTHETIC和MANDATED作为在使用调节剂Exports,ModuleDescriptor,Opens和Requires.这两者之间的区别是什么,在实践中优于另一个?
Q2.Synthetic Modifier如果没有在模块的源代码中声明,那么无论如何都是一个例子?
使用IDEA-EAP进行JDK9开发实验.
我收到以下错误 -
Run Code Online (Sandbox Code Playgroud)Error:(3, 20) java: package jdk.internal.misc is not visible (package jdk.internal.misc is declared in module java.base, which does not export it to module com.jigsaw.npe)
类定义如下 -
package experiment;
import jdk.internal.misc.Unsafe;
public class CompareAndSwap {
static Unsafe UNSAFE = Unsafe.getUnsafe();
...
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试module-info.java在使用IDE创建的模块中包含一个文件,其中包含以下语句 -
module com.jigsaw.npe {
requires java.base;
}
Run Code Online (Sandbox Code Playgroud)
目录结构现在看起来如图所示 -
IDE虽然反映了module-info.java未使用的,但可能这就是我无法定义module com.jigsaw.npe上面尝试过的原因.
寻求一些帮助,了解如何正确放置module-info.java和/或除了我错过的以外的任何东西.
java java-platform-module-system java-9 java-module module-info
java ×10
module-info ×10
java-9 ×8
java-module ×8
java-platform-module-system ×3
maven ×2
java-10 ×1
java-11 ×1
netty ×1
requires ×1
uberjar ×1