到目前为止,我们一直在使用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
Sun正在以Jigsaw的形式将JDK模块化,并且暗示它应该是其他Java开发人员的首选模块格式.使用它的唯一值得注意的玩家是NetBeans(和衍生应用程序).
另一方面,业界已经围绕OSGi进行了标准化,所有主要的应用程序供应商都将其运行时基于模块平台,甚至是Sun自己的Glassfish.甚至还有一个NetBeans端口使用OSGi作为模块系统而不是NetBeans自己的模块.甚至Maven也在努力成为OSGi运行时.
它只是NIH,许可或其他原因吗?
背景
在maven中,工件可以声明依赖关系
<optional>true</optional>
Run Code Online (Sandbox Code Playgroud)
这意味着不需要依赖,但如果存在则可以使用.
模块系统的状态似乎指定模块只能读取它所需的模块.
问题
用例
我有一个框架,集成了应用程序可能使用或不使用的各种库.目前,该框架是一个单独的JAR,它反映了类路径以跳过缺少库的集成代码.
我想我们可以将它分成每个配置的单独模块,但这会导致JAR数量的组合爆炸,因为我们不仅需要为每个可选依赖项单独的JAR,而且对于大多数对都需要单独的JAR可选的依赖项......
Javadoc工具基于可访问性修饰符生成文档.默认情况下,它记录所有public和protected类,字段和方法.可以使用以下选项更改此设置:
-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)
?
在stackoverflow上多次提到自动模块,但我找不到自动模块的完整,简洁和自给自足的定义.
那么,什么是自动模块?它是否导出所有包裹?它打开所有包裹吗?它是否读取所有其他模块?
带有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 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.collect有module-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
我在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,我收到编译错误.我怎样才能做到这一点?
我们使用maven并拥有依赖于其他内部工件的工件.我正在迁移到java-9,并且打算首先将所有内容迁移到Java 9而不模块化代码(即在未命名的模块中).
我遇到的问题是我们依赖java.xml.bind,现在不包含在默认模块中.是否有一种"正确"的方式来表达对java.xml.bindMaven的依赖?
--add-opens我最近迁移到 Java 17,由于运行应用程序时的一个依赖项,它带来了一些限制,要求我使用。
我需要在java -jar运行命令时添加它。现在我找到了这些解决方案:
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)
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-platform-module-system ×10
java ×9
java-9 ×7
java-module ×4
maven ×3
module ×2
osgi ×2
annotations ×1
javadoc ×1
jaxb ×1
jsr305 ×1