标签: java-9

Java 9中--add-exports和--add-opens之间有什么区别?

由于新的模块系统,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

29
推荐指数
1
解决办法
9828
查看次数

由于新的文件夹结构,在Linux上的Intellij IDEA中正确设置Java 9作为SDK

在你写下我之前,请考虑这些都不是我的问题的答案:


在IntelliJ IDEA 2017.2.6中,尝试将JDK9作为SDK添加但不起作用,因为类路径最终为空.重现步骤:

  1. 打开"添加新SDK对话框"
    (转到项目设置>项目>项目SDK>新建> JDK)
  2. 选择JDK 9
    选择jdk对话框
  3. 通过,但如果您在SDK下查看> JDK9类路径为空,并且由于找不到基类而导致代码错误.见图:
    没有类路径

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

  1. 打开"添加新SDK对话框"
    (转到项目设置>项目>项目SDK>新建> JDK)
  2. 选择JDK 9
    选择jdk对话框
  3. 应该通过,但会产生错误弹出窗口
    jdk错误弹出窗口

使用jdk9的HelloWorld示例的命令行编译按预期工作.

编辑:发现几乎重复:Intellij IDEA 2017.2无法在Linux Mint 18上添加openjk 9.主要差异:

  • Linux版本:他们使用Mint 18,我正在使用Debian Stretch.
  • OpenJDK是写作时回购的最新版本:9~b181-4~bpo9 + 1.即使是相同的版本,它仍然不适用于我的情况.

编辑:另一个可能的重复:intellij想法没有看到Java 9标准类

我不明白这些评论的答案.尝试为JDK(9和1.9)设置不同的名称,但它仍然没有显示模块而不是类路径,类路径仍为空.

java openjdk intellij-idea java-9

29
推荐指数
2
解决办法
6996
查看次数

为什么Optional或flatMap方法的供应商类型参数是通配符?

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 optional java-9 supplier

29
推荐指数
3
解决办法
1146
查看次数

在Java 9中使用VarHandle的正确方法?

我花了很多时间研究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)

但下一步是什么?我的意思是,如何使用这个可变句柄?你能提供任何真实的例子吗?

java java-9

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

Java 9的Maven编译问题

尝试使用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)

maven java-9

28
推荐指数
5
解决办法
9620
查看次数

包与Java 9中的自动模块冲突

随着Java 9的出现,我认为将我的一些项目移植到Java 9是一个很好的学习练习.在我的一个项目中,我有rxjavarxjavafx的依赖

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在这里.但是,这些库还没有任何模块信息.

为了解决这个问题,我读过我需要创建自动模块.根据我的理解,我需要重命名rxjavarxjavafx罐子有一个简单的名称,然后列出--module-path参数中的罐子.然后requiresmodule-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)

java compiler-errors java-platform-module-system java-9

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

如何在java9中解析模块读取包错误

我试图通过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)

java maven spring-boot java-9

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

--add-modules仅用于编译

我正在使用maven和构建我的项目.我在我的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命令行参数?

java jaxb maven maven-compiler-plugin java-9

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

在IntelliJ IDEA中编译错误:"没有MessageCollector"

编辑:解决了.请参阅@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)

java compiler-errors intellij-idea kotlin java-9

27
推荐指数
1
解决办法
1081
查看次数

错误:BUG!源单元'_BuildScript_'中不支持的目标模块的阶段'类生成'中的异常

我正在尝试使用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 intellij-idea gradle java-9

26
推荐指数
2
解决办法
8196
查看次数