标签: java-platform-module-system

JSR-305注释替代Java 9

到目前为止,我们一直在使用Findbugs JSR-305注释(com.google.code.findbugs:jsr305),包括工具支持(Sonar,Eclipse,Findbugs,...)在内的一切工作正常.

但是我们的理解是Java 9中的Jigsaw将打破JSR-305注释(不允许在两个模块中使用一个包).这在JavaOne 2015上得到了证实.Oracle的推理是JSR-305从未发生过,JSR-250必须支持这些注释.

我们正在寻找可以在Java 8和Java 9中工作的JSR-305注释的替换.如果历史是任何指南,Java 9 GA和Java 8 EOL之间的时间将相当短,我们想修复我们的任何不兼容性提前编码.从理论上讲,我们可以升级JDK的注释模块,但是在我们的工具链中执行此操作似乎需要做很多工作.

annotations static-analysis jsr305 java-platform-module-system java-9

25
推荐指数
1
解决办法
3643
查看次数

当每个人都在OSGi上进行标准化时,为什么Sun会发明另一个模块系统?

Sun正在以Jigsaw的形式将JDK模块化,并且暗示它应该是其他Java开发人员的首选模块格式.使用它的唯一值得注意的玩家是NetBeans(和衍生应用程序).

另一方面,业界已经围绕OSGi进行了标准化,所有主要的应用程序供应商都将其运行时基于模块平台,甚至是Sun自己的Glassfish.甚至还有一个NetBeans端口使用OSGi作为模块系统而不是NetBeans自己的模块.甚至Maven也在努力成为OSGi运行时.

它只是NIH,许可或其他原因吗?

java osgi module java-platform-module-system

24
推荐指数
3
解决办法
1409
查看次数

Java 9 Module系统是否支持可选的依赖项?

背景

在maven中,工件可以声明依赖关系

<optional>true</optional>
Run Code Online (Sandbox Code Playgroud)

这意味着不需要依赖,但如果存在则可以使用.

模块系统的状态似乎指定模块只能读取它所需的模块.

问题

  • Java 9模块系统确实不支持可选的依赖项吗?
  • 为什么不?
  • Java 9模块系统提供了哪些可选依赖项替代方案?

用例

我有一个框架,集成了应用程序可能使用或不使用的各种库.目前,该框架是一个单独的JAR,它反映了类路径以跳过缺少库的集成代码.

我想我们可以将它分成每个配置的单独模块,但这会导致JAR数量的组合爆炸,因为我们不仅需要为每个可选依赖项单独的JAR,而且对于大多数对都需要单独的JAR可选的依赖项......

java java-platform-module-system java-9

23
推荐指数
1
解决办法
1298
查看次数

Javadoc如何处理Java 9中模块的可见性?

Javadoc工具基于可访问性修饰符生成文档.默认情况下,它记录所有publicprotected类,字段和方法.可以使用以下选项更改此设置:

-public
仅显示公共类和成员.

-protected
仅显示受保护的公共类和成员.这是默认值.

-package
仅显示包,受保护和公共类和成员.

-private
显示所有类和成员.

Java 9引入了模块的概念,项目Jigsaw将其应用于现有的JDK.一马克莱因霍尔德(在一系列有关模块会谈3日)显示了如何public修改目前已拥有不同级别的可访问的,这取决于模块(通过可见性exports):

  • 公开给大家
  • 公开但仅限于特定模块
  • 仅在模块内公开

由于现在并非所有公共成员都可以访问,因此继续使用相同的Javadoc生成方案将没有多大意义.只有那些暴露在"足够"水平的成员才应该被记录下来.

Javadoc模块是否可识别?除了上面的命令选项还有处理额外曝光层的命令选项吗?对于仅暴露给特定模块的公共成员,Javadoc是否列出了这些,如

public <module1, module2> static void getDefaultThing()
Run Code Online (Sandbox Code Playgroud)

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

23
推荐指数
1
解决办法
852
查看次数

什么是自动模块?

在stackoverflow上多次提到自动模块,但我找不到自动模块的完整,简洁和自给自足的定义.

那么,什么是自动模块?它是否导出所有包裹?它打开所有包裹吗?它是否读取所有其他模块?

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

23
推荐指数
3
解决办法
4129
查看次数

Java 8模块与OSGi有何不同?

带有Project Jigsaw的Java 8为SDK带来了一个模块系统.我认为它是一件好事,因为它是包的一部分(内置).OSGi还提供了一个模块系统,但需要一个容器.但除此之外,它们之间的主要区别是什么.

如果我使用OSGi,我是否可以使用标准的JDK 8版本运行它?

当默认SDK包含此类功能时,OSGi是否相关?我的理解是OSGi和Jigsaw都可以用来编写普通的模块化Java应用程序而不仅仅是基于ser的应用程序(servlet等),对吗?

给出了OSGi,Java Modularity和Jigsaw这个问题的答案说Jigs的Jigsaw模块系统可能是必需的.通过JRE,我假​​设OP意味着Java标准库,如IO,CORBA,RMI,它们是用Java编写的,还是作为目标的类库实现?从阅读Jigsaw项目页面,我认为它是前者.如果是后者,它甚至会如何帮助编写Java代码的其他Java开发人员?类库是用C/C++编写的.有人可以澄清一下吗?

这不是OSGi vs Jigsaw.我想真正了解使用哪一个.如果我要编写一个新的应用程序(无论是桌面还是服务器),我希望基于可能不会被标准实现淘汰的技术并放弃使用.我不是说OSGi已经过时了,我喜欢OSGi.我正在看大局,OSGi本身未来的发展方向.

java osgi module java-platform-module-system

21
推荐指数
1
解决办法
9806
查看次数

在IntelliJ IDEA 2017.2.1中无法使用--patch-module编译Java 9模块

我试图熟悉Java 9模块以及如何在IntelliJ中定义它们.除此之外,我想使用--patch-module编译器/ JVM标志解决拆分包问题,我不知道如何使它在IntelliJ中工作.

我正在使用IntelliJ IDEA 2017.2.1使用Java HotSpot(TM)64位服务器VM构建#IC 172.3544.35(内置9 + 180,混合模式).

这是我的源文件MyImmutableList.java:

package com.google.common.collect;

public class MyImmutableList extends RegularImmutableList {
  public MyImmutableList(Object[] array) {
    super(array);     
  }
}
Run Code Online (Sandbox Code Playgroud)

它属于我的模块com.effjava.collectmodule-info.java:

module com.effjava.collect {
    // do not require module guava; instead patch this module with guava.19-0.jar via:
    // javac --patch-module com.effjava.collect=guava-19.0.jar module-info.java com/google/common/collect/MyImmutableList.java
    //    requires guava;        
    exports com.google.common.collect;
}
Run Code Online (Sandbox Code Playgroud)

为了编译我的模块,我--patch-module使用Settings=> Build,Execution,Deplyoment=> Compiler=> 在IntelliJ中指定了标志,Shared build process VM options如此处所述 …

java intellij-idea java-platform-module-system java-9 java-module

21
推荐指数
1
解决办法
2025
查看次数

如何为名称中带有" - "(连字符)的工件添加"要求"

我在Maven pom.xml中包含了这些依赖项:

 <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${httpclient.version}</version>
</dependency>

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我试图在module-info.java中添加这种依赖,如下所示:

module io.github.wildcraft.restclient {
    requires httpcore; // no compilation problem
    requires httpclient; // no compilation problem
    requires commons-io; // shows compilation error
}
Run Code Online (Sandbox Code Playgroud)

对于commons-io,我收到编译错误.我怎样才能做到这一点?

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

21
推荐指数
2
解决办法
1160
查看次数

如何表达maven对Java ee功能的依赖以转换到Java 9?

我们使用maven并拥有依赖于其他内部工件的工件.我正在迁移到,并且打算首先将所有内容迁移到Java 9而不模块化代码(即在未命名的模块中).

我遇到的问题是我们依赖java.xml.bind,现在不包含在默认模块中.是否有一种"正确"的方式来表达对java.xml.bindMaven的依赖?

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

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

如何从项目级别指定 --add-opens 并确保无论以何种方式运行我的应用程序都将其考虑在内?

--add-opens我最近迁移到 Java 17,由于运行应用程序时的一个依赖项,它带来了一些限制,要求我使用。

我需要在java -jar运行命令时添加它。现在我找到了这些解决方案:

  • 我可以将其添加到运行该项目的 Dockerfile 中的命令行参数中
java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED -jar my.jar
Run Code Online (Sandbox Code Playgroud)
  • 我可以通过我的 Maven 将它添加到我的 MANIFEST.MF 中pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifestEntries>
                <Add-Opens>java.base/sun.util.calendar java.base/java.util</Add-Opens>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

显然,两者都适合生产。然而,当通过 IntelliJ 运行我的应用程序时,它没有选择我认为是正常的选项。我必须将它们设置在我的运行配置中(顺便说一下,它也提交给我的项目)作为虚拟机参数。

我正在寻找一种方法来自动确保一致性,而不必在我声明附加打开的两个地方并行维护。

编辑:我想知道 argfiles 是否可行。就像我的项目中有一个 argfile 一样,它将在 jar 中引用,并且可以在 y 运行配置中引用。我还没有找到太多证据,但这就是我目前正在追求的道路。

编辑2:我addopens在项目的根目录添加了一个文件,现在可以从我需要它的各个点引用它。对于测试,我添加了这个,并且它与 IntelliJ 测试和 Maven 测试一起开箱即用:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <!-- This adds the options contained in the addopens file to the test JVM arguments -->
        <argLine>@addopens @{argLine}</argLine>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我还可以将该addopens …

java intellij-idea maven java-platform-module-system

19
推荐指数
2
解决办法
4万
查看次数