小编Nic*_*lai的帖子

使用Java EE API替换已弃用的JPMS模块

Java 9 弃用了六个包含Java EE API的模块,它们很快被删除:

  • javax.activation包的java.activation
  • java.corbajavax.activity,javax.rmi,javax.rmi.CORBA,和org.omg.*
  • javax.transaction包的java.transaction
  • 包含所有javax.xml.bind.*包的java.xml.bind
  • java.xml.wsjavax.jws,javax.jws.soap,javax.xml.soap,和所有javax.xml.ws.*
  • javax.annotation包的java.xml.ws.annotation

哪些维护的第三方工件提供了这些API?它们提供这些API或它们必须提供的其他功能并不重要 - 重要的是,它们是这些模块/包的直接替代品吗?

为了更容易收集知识,我回答了迄今为止我所知道的并将答案作为社区维基.我希望人们能够扩展它,而不是写出自己的答案.


在您投票结束之前:

  • 是的,已经有一些关于单个模块的问题,这个问题的答案当然会复制这些信息.但AFAIK没有任何一点可以了解所有这些,我认为这些有很大的价值.
  • 提出图书馆建议的问题通常被认为是偏离主题的,因为"他们倾向于吸引自以为是的答案和垃圾邮件",但我不认为这适用于此.明确描述了一组有效的库:它们必须实现特定的标准.除此之外别无其他,所以我没有看到很多意见和垃圾邮件的风险.

java java-ee java-9 java-module

150
推荐指数
6
解决办法
5万
查看次数

如何解决InaccessibleObjectException("无法使{member}可访问:模块{A}在Java 9上没有'打开{package}'到{B}")?

在Java 9上运行应用程序时,在各种情况下都会发生此异常.某些库和框架(Spring,Hibernate,JAXB)特别容易出现这种情况.这是Javassist的一个例子:

java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @1941a8ff
    at java.base/jdk.internal.reflect.Reflection.throwInaccessibleObjectException(Reflection.java:427)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:201)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
    at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:102)
    at javassist.util.proxy.FactoryHelper.toClass2(FactoryHelper.java:180)
    at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:163)
    at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:501)
    at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:486)
    at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:422)
    at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:394)
Run Code Online (Sandbox Code Playgroud)

消息说:

无法使受保护的最终java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte [],int,int,java.security.ProtectionDomain)抛出java.lang.ClassFormatError可访问:module java.base没有"打开java.lang"到未命名的模块@ 1941a8ff

可以做些什么来避免异常并使程序成功运行?

java reflection java-9

52
推荐指数
9
解决办法
2万
查看次数

java 9中javax.activation包的替代是什么?

似乎javax.activation在Java 9中不推荐使用package .Oracle迁移指南建议--add-modules java.activation在JVM启动期间使用选项.

但是,我想避免这种情况并替换javax.activationpackage的类,因为它已被弃用,并将在以后的java版本中删除.我想,应该有某种替代方案javax.activation.如果有可用的话,它是什么?

java jvm javax.activation java-9

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

JAXB在Tomcat 9和Java 9/10上不可用

TLDR:在Java 9/10上,Tomcat中的Web应用程序无法访问JAXB,即使它的引用实现存在于类路径中.

编辑:不,这不是如何解决java.lang.NoClassDefFoundError:Java 9中的javax/xml/bind/JAXBException的副本- 正如您在"我尝试过的内容"部分所述,我已经尝试了所提出的解决方案.

情况

我们有一个在Tomcat上运行的Web应用程序,它依赖于JAXB.在我们迁移到Java 9期间,我们选择将JAXB参考实现添加为常规依赖项.

具有嵌入式Tomcat的IDE启动应用程序时,一切正常,但在真正的Tomcat实例上运行时,我收到此错误:

Caused by: java.lang.RuntimeException: javax.xml.bind.JAXBException:
    Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
    at [... our-code ...]
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278) ~[jaxb-api-2.3.0.jar:2.3.0]
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[jaxb-api-2.3.0.jar:2.3.0]
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[jaxb-api-2.3.0.jar:2.3.0]
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[jaxb-api-2.3.0.jar:2.3.0]
    at [... our-code ...]
Caused by: …
Run Code Online (Sandbox Code Playgroud)

java tomcat java-9 java-10

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

为什么Java的基于价值的类不能被序列化?

从版本8开始,Java具有基于值的的概念.这是为了准备将来很可能允许定义值类型的未来版本.两个定义/描述都提到序列化(我添加的粗体):

关于现有的基于价值的课程:

如果程序试图将两个引用区分为基于值的类的相等值,无论是直接通过引用相等还是间接通过引发同步,身份哈希,序列化或任何其他身份敏感机制,程序可能会产生不可预测的结果.

关于未来的价值类型:

通过System.identityHashCode提供的对象的默认基于身份的哈希代码也不适用于值类型.像序列化这样的内部操作会对对象进行基于身份的区分,这些操作要么不适用于值(因为它们不适用于基元),要么它们将使用值类型的hashCode方法提供的基于值的区别.

因为未来的JVM实现可能不会使用对象标头和基于值的类的引用指针,所以一些限制很明显.(例如,没有锁定JVM必须不支持的标识.锁定的引用可以被删除并在以后被另一个替换,这使得释放锁定毫无意义并将导致死锁).

但我不知道序列化如何发挥作用.为什么它被认为是"身份敏感机制"?为什么它"以对象为基础进行基于身份的区分"

java serialization java-8

18
推荐指数
2
解决办法
3031
查看次数

Maven可以生成模块声明

模块声明定义,除其他事项外,模块的依赖性.如果我使用Maven作为构建工具,这是多余的,因为pom.xml已经包含这些(和更多)信息.基于此,Maven不能module-info.java为我生成吗?

java maven java-9

14
推荐指数
1
解决办法
1282
查看次数

如何排除Maven插件的直接依赖关系

我想排除Maven插件的直接依赖,并且此答案中描述的方法不起作用(如本评论所示).

作为一个特例:

<build>
    <plugins>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.13.2</version>
            <!-- more config -->
            <dependencies>
                <dependency>
                    <groupId>org.jvnet.jaxb2.maven2</groupId>
                    <artifactId>maven-jaxb2-plugin</artifactId>
                    <version>0.13.2</version>
                    <exclusions>
                        <exclusion>
                            <groupId>javax.xml.bind</groupId>
                            <artifactId>jaxb-api</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

我仍然javax.xml.bind:jaxb-api在依赖列表中看到(带mvn ... -X).我究竟做错了什么?

(如果有人知道如何用该API的JDK 9等效替换该工件的依赖关系[似乎发生在Java 8上,其中"JAXB API os从[jar:... jre/lib]加载/rt.jar]"],我很高兴为此开启一个新问题.)

更新

想法用完了,无论如何这都是一个实验,我通过pom.xml在我的本地存储库中编辑插件来排除依赖.现在mvn ... -X表明org.jvnet.jaxb2.maven2:maven-jaxb22-plugin我还可以通过上面的机制成功排除间接依赖(在这种情况下).只使用两个排除,从maven-jaxb2-pluginmaven-jaxb22-plugin,不会做的伎俩.这表明排除通常起作用,但显然不是插件的直接依赖.

(顺便说一句,这确实导致"Java JAXB API从[jrt:/java.xml.bind]"加载,这是我的目标.)

java jaxb maven

13
推荐指数
1
解决办法
2455
查看次数

平台模块之间是否允许循环?

这是模块的模块声明java.rmi:

module java.rmi {
    requires java.base;
    requires java.logging;

    exports java.rmi.activation;
    exports com.sun.rmi.rmid to java.base; // <-- cycle
    ...
}
Run Code Online (Sandbox Code Playgroud)

那么,java.rmi和之间存在循环依赖关系java.base,对吗?平台模块之间是否允许循环?

java java-platform-module-system java-9

11
推荐指数
1
解决办法
219
查看次数

创建一个包含跟踪信息的新分支

这是我通常的工作流程:

  1. 创建一个新的分支: git checkout -b foo
  2. 提交一些东西
  3. 推动: git push
  4. 生气,推不起作用(没有上游设置)
  5. 到达鼠标以突出显示git推荐的命令(仍然生气)
  6. 推进设置上游:( git push --set-upstream origin foo愤怒消退)

而不是4.到6.,我想在本地创建新分支时做一些工作(不一定让我的分支公开,所以没有推动)杀死步骤4.到6.这可能吗?

理想情况下git checkout -b foo -t origin,通知git我计划跟踪同名分支origin.

我试过的

git checkout -b foo --set-upstream origin foo 〜> error: unknown option 'set-upstream'

git checkout --track origin/foo 〜> fatal: Cannot update paths and switch to branch 'foo' at the same time.

git checkout -b foo --track origin/foo 〜> fatal: Cannot update paths and switch to branch 'foo' at …

git

8
推荐指数
1
解决办法
168
查看次数

jlink:服务绑定链接许多不必要的模块

我面临的问题是jlink的服务绑定选项链接了许多模块,似乎没有必要.省略服务绑定选项时,不链接这些模块.

问题:

  • Q1:您是否在环境中看到了相同的行为?
  • Q2:这是一个错误还是一个理想的行为?
  • 问题3:为什么所有这些模块都链接在一起?

我的应用程序:应用程序是一个简单的服务,由一个接口,一个提供者和一个使用者组成,每个服务都打包到一个单独的模块中,称为modService,modProvider,modConsumer(详见下文).

操作系统:Windows 10

Jlink 没有 --bind-services产生预期的结果:

jlink --module-path "mods;%JAVA_HOME%\jmods"
    --add-modules modConsumer
    --output myRuntime

java --list-modules
java.base@9
modConsumer
modService 
Run Code Online (Sandbox Code Playgroud)

当应用该--bind-services选项时,我希望另外应该链接模块modProvider.但是,看看会发生什么(三个自定义模块在最后):

jlink --module-path "mods;%JAVA_HOME%\jmods"
    --bind-services
    --add-modules modConsumer
    --output myRuntime

java --list-modules
java.base@9
java.compiler@9
java.datatransfer@9
java.desktop@9
java.logging@9
java.management@9
java.management.rmi@9
java.naming@9
java.prefs@9
java.rmi@9
java.scripting@9
java.security.jgss@9
java.security.sasl@9
java.smartcardio@9
java.xml@9
java.xml.crypto@9
jdk.accessibility@9
jdk.charsets@9
jdk.compiler@9
jdk.crypto.cryptoki@9
jdk.crypto.ec@9
jdk.crypto.mscapi@9
jdk.deploy@9
jdk.dynalink@9
jdk.internal.opt@9
jdk.jartool@9
jdk.javadoc@9
jdk.jdeps@9
jdk.jfr@9
jdk.jlink@9
jdk.localedata@9
jdk.management@9
jdk.management.cmm@9
jdk.management.jfr@9 …
Run Code Online (Sandbox Code Playgroud)

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

8
推荐指数
2
解决办法
626
查看次数