由于新的模块系统,Java 9(jdk-9 + 170)默认情况下不允许应用程序查看JDK中的所有类,这与以前的所有Java版本不同.
要解决此问题,java命令行会提供一个新参数--add-exports,允许按如下方式中断封装:
java -jar josm.jar --add-exports java.base/sun.security.util=ALL-UNNAMED --add-exports java.base/sun.security.x509=ALL-UNNAMED
这在JEP 261中得到了很好的解释.
我已经阅读了--add-opens使用相同语法的类似选项,但是JEP 261尚未更新来描述它(最后更新:2017/03/08 13:58).
这两个选项有什么区别?
编辑:JEP 261已在2017-09-22更新以解释它.
java command-line-arguments java-platform-module-system java-9 java-module
在你写下我之前,请考虑这些都不是我的问题的答案:
在IntelliJ IDEA 2017.2.6中,尝试将JDK9作为SDK添加但不起作用,因为类路径最终为空.重现步骤:


在IntelliJ IDEA 2017.3 EAP中,您收到有关未找到JDK类的错误.见下图:


使用jdk9的HelloWorld示例的命令行编译按预期工作.
编辑:发现几乎重复:Intellij IDEA 2017.2无法在Linux Mint 18上添加openjk 9.主要差异:
编辑:另一个可能的重复:intellij想法没有看到Java 9标准类
我不明白这些评论的答案.尝试为JDK(9和1.9)设置不同的名称,但它仍然没有显示模块而不是类路径,类路径仍为空.
该Optional.or方法是在Java 9中添加的.这是方法签名
public Optional<T> or?(Supplier<? extends Optional<? extends T>> supplier)
Run Code Online (Sandbox Code Playgroud)
为什么是的类型参数Supplier回吐? extends Optional,而不是仅仅Optional因为Optional是最后的类?
该Optional.flatMap方法也是如此.这是Java 8的变化.
在Java 8中,它被Function<? super T, Optional<U>> mapper改为Function<? super T,?? extends Optional<? extends U>>Java 9.
我花了很多时间研究Java 9的一些新功能,但我没有找到任何有用和实用的例子.
考虑下一个创建VarHandle的代码片段:
class Counter {
int i;
}
class VarHandleInAction {
static final VarHandle VH_COUNTER_FIELD_I;
static {
try {
VH_COUNTER_FIELD_I = MethodHandles.lookup().
in(Counter.class).
findVarHandle(Counter.class, "i", int.class);
} catch (Exception e) {
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
但下一步是什么?我的意思是,如何使用这个可变句柄?你能提供任何真实的例子吗?
尝试使用JDK 9.0.1编译Maven项目我面对这个堆栈跟踪没有太多解释:
Exception in thread "main" java.lang.AssertionError
at jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155)
at jdk.compiler/com.sun.tools.javac.util.Assert.check(Assert.java:46)
at jdk.compiler/com.sun.tools.javac.comp.Modules.enter(Modules.java:250)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.readSourceFile(JavaCompiler.java:821)
at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ImplicitCompleter.complete(JavacProcessingEnvironment.java:1510)
at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:633)
at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1314)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.complete(Type.java:1139)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.getTypeArguments(Type.java:1065)
at jdk.compiler/com.sun.tools.javac.code.Printer.visitClassType(Printer.java:237)
at jdk.compiler/com.sun.tools.javac.code.Printer.visitClassType(Printer.java:52)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:992)
at jdk.compiler/com.sun.tools.javac.code.Printer.visit(Printer.java:136)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArgument(AbstractDiagnosticFormatter.java:197)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArguments(AbstractDiagnosticFormatter.java:165)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:111)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:67)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArgument(AbstractDiagnosticFormatter.java:183)
at jdk.compiler/com.sun.tools.javac.util.AbstractDiagnosticFormatter.formatArguments(AbstractDiagnosticFormatter.java:165)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:111)
at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.java:67)
at jdk.compiler/com.sun.tools.javac.util.JCDiagnostic.getMessage(JCDiagnostic.java:771)
at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$DiagnosticSourceUnwrapper.getMessage(ClientCodeWrapper.java:799)
at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:131)
at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:174)
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1075)
at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:168)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
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 …Run Code Online (Sandbox Code Playgroud) 随着Java 9的出现,我认为将我的一些项目移植到Java 9是一个很好的学习练习.在我的一个项目中,我有rxjava和rxjavafx的依赖项
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxjavafx:1.0.0'
...
}
Run Code Online (Sandbox Code Playgroud)
我想将此项目创建为命名模块.要做到这一点,我需要创建一个module-info.java文件,我需要指定的要求rxjava,并rxjavafx在这里.但是,这些库还没有任何模块信息.
为了解决这个问题,我读过我需要创建自动模块.根据我的理解,我需要重命名rxjava和rxjavafx罐子有一个简单的名称,然后列出--module-path参数中的罐子.然后requires我module-info.java在jar中添加一个指令.
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
Run Code Online (Sandbox Code Playgroud)
我编写了一个gradle任务来为我编辑jar名称,它似乎在大多数情况下都有效.它需要编译所有的jar并将它们重命名为不包含version-info或slashes.然后将这些文件连接成一个:单独的字符串:
tasks.withType(JavaCompile) {
delete { delete '/tmp/gradle' }
copy {
from configurations.compile + configurations.testCompile
into '/tmp/gradle'
rename '(.*)-[0-9]+\\..*.jar', '$1.jar'
rename { String fileName -> fileName.replace("-", "") }
}
options.compilerArgs += ['--module-path', fileTree(dir: '/tmp/gradle', include: …Run Code Online (Sandbox Code Playgroud) 我试图通过spring-boot来理解java 9中的新模块化,所以我想运行一些简单的应用程序,例如:https://github.com/tmatyashovsky/java9-springboot
我正在使用maven 3.5.0和java 9:
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-03T21:39:06+02:00)
Maven home: ~/soft/apache-maven-3.5.0
Java version: 9-ea, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-9-oracle
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-79-generic", arch: "amd64", family: "unix"
Run Code Online (Sandbox Code Playgroud)
问题是我还有一些例外.它是什么意思,我应该如何解决它?
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project api: Compilation failure: Compilation failure:
[ERROR] module reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation
[ERROR] module spring.core reads package javax.annotation from both tomcat.embed.core and java.xml.ws.annotation
[ERROR] module spring.jcl reads …Run Code Online (Sandbox Code Playgroud) 我正在使用maven和java-9构建我的项目.我在我的pom.xml文件中添加了:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgs>
<arg>--add-modules</arg>
<arg>java.xml.bind</arg>
</compilerArgs>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但是,为了运行应用程序,我必须像这样运行它:
java -jar --add-modules java.xml.bind my-app.jar
Run Code Online (Sandbox Code Playgroud)
有没有办法构建应用程序,从命令行运行而不是--add-modules java.xml.bindjava命令行参数?
编辑:解决了.请参阅@acdsee评论以了解具体方法.
自从我将IntelliJ IDEA从2017.3.5更新到2018.1以来,我开始的每个项目都抛出了这个错误:
> Error:Module 'JBA' production: java.lang.Exception: LOGGING: Loading
> modules: [java.se, javafx.base, javafx.controls, javafx.fxml,
> javafx.graphics, javafx.media, javafx.swing, javafx.web,
> jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink,
> jdk.httpserver, jdk.incubator.httpclient, jdk.jartool, jdk.javadoc,
> jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject,
> jdk.management, jdk.management.cmm, jdk.management.jfr,
> jdk.management.resource, jdk.net, jdk.packager, jdk.packager.services,
> jdk.scripting.nashorn, jdk.sctp, jdk.security.auth, jdk.security.jgss,
> jdk.unsupported, jdk.xml.dom, oracle.desktop, oracle.net, java.base,
> java.compiler, java.datatransfer, java.desktop, java.xml,
> java.instrument, java.logging, java.management, java.management.rmi,
> java.rmi, java.naming, java.prefs, java.scripting, java.security.jgss,
> java.security.sasl, java.sql, java.sql.rowset, java.xml.crypto,
> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用gradle创建一个新的Java 9项目,但是在项目创建之后我从gradle收到错误:
Error:BUG! exception in phase 'class generation' in source unit '_BuildScript_' unsupported Target MODULE
Run Code Online (Sandbox Code Playgroud)
Java版本:9(build 9 + 178)
Gradle版本:4.1-rc-2
根据这篇文章,那些java/gradle版本应该是兼容的.
我怎么解决这个问题?
任何帮助高度赞赏.
java-9 ×10
java ×9
maven ×3
java-platform-module-system ×2
gradle ×1
java-module ×1
jaxb ×1
kotlin ×1
openjdk ×1
optional ×1
spring-boot ×1
supplier ×1