我有一个读取系统属性的类加载器应用程序 sun.boot.class.path
但是我在 JDK 9 的发行说明中发现此属性已被删除。
System.getProperty("sun.boot.class.path"); // In JDK 9/10 this returns null
Run Code Online (Sandbox Code Playgroud)
但是我还是想在JDK 10中检索这个属性值,怎么做呢?
我期待如下值:
/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jfr.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/classes
Run Code Online (Sandbox Code Playgroud)
供参考:
我不想使用该-Xbootclasspath选项。只需要路径值。
我有一个Java applet,它提供了一个GUI来调用Web服务.它使用Jaxb来解析XML数据并将其解组为对象.它使用Java 1.5到1.8正确运行.使用Java 9,不是那么多.
我使用容器HTML在Internet Explorer 8 + JDK 9中启动它:
<applet code="com.blah.MyApplet" archive="myFatJarWithDependencies.jar" mayscript>
<param name="cache_option" value="no" />
</applet>
Run Code Online (Sandbox Code Playgroud)
小程序加载很好,似乎工作; 但是,一旦我连接到Web服务,它那种停止工作.我把它缩小到这个代码片段(其中Foo是一个带有XML绑定注释的自动生成的类):
System.out.println("1");
JAXBContext jc = JAXBContext.newInstance(Foo.class);
System.out.println("2");
Run Code Online (Sandbox Code Playgroud)
Java的控制台显示1,然后......没有:它没有崩溃,applet仍然响应鼠标点击,它不会抛出任何异常......似乎根本没有错误.除了它没有对接收的数据做任何事情,它从不输出2.我已经尝试了替代JAXBContext.newInstance方法(使用包名,包名加上类加载器),但它们都是一样的.
如果我使用相同的JDK 9从Eclipse Oxygen运行项目,它确实有效.当我连接到Web服务时,它会输出一些警告,包括:
WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector
(file:/C:/.../.m2/repository/com/sun/xml/bind/jaxb-impl/2.0/jaxb-impl-2.0.jar) to method
java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access
operations
Run Code Online (Sandbox Code Playgroud)
但随后它继续并加载数据(并输出2到控制台).我的猜测是同样的问题,即使Java控制台中没有显示警告.也许JDK默认--illegal-access=deny是从IE运行的时候?或者"默默地否认 - 所以 - 用户 - 不要发生什么线索" …
我正在尝试按照下面给出的步骤创建 Java9 的 HelloWorld 模块。
右键单击项目(即 com.hello)>新建>源文件夹>输入源文件夹名称(即com.hello)
右键单击源文件夹(即com.hello)>新建>文件>输入文件名(模块的java9标准文件名是module-info.java)
module com.hello {
exports com.hello;
}
Run Code Online (Sandbox Code Playgroud)右键Package(即com.hello)>New>输入类名(即HelloWorld)
package com.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Run Code Online (Sandbox Code Playgroud)右键单击HelloWorld>Run As>Java Application It throws
启动层初始化时出错
java.lang.module.FindException:未找到模块 com.hello
PS:尝试此解决方案后,我的项目结构如下所示
注意:我还注意到一件事。保存更改后。日食(氧气)投掷
构建过程中发生错误。在项目“com.hello”上运行构建器“Java Builder”时出错。未知常量池类型 19
我有一个用 Java 11 编写的简单应用程序。mvn clean verify(maven 3.6.0)执行时出错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project parser: Compilation failure
[ERROR] ...src/main/java/module-info.java:[2,32] module not found: org.apache.logging.log4j
Run Code Online (Sandbox Code Playgroud)
依赖项:
<log4j.version>2.11.1</log4j.version>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
模块信息.java:
module abc {
requires org.apache.logging.log4j;
}
Run Code Online (Sandbox Code Playgroud)
Log4j2 配置是默认的并且在 .xml 文件中。用法:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(Abc.class);
logger.info("Boom!");
Run Code Online (Sandbox Code Playgroud)
我在 stackoverflow 上尝试了所有相关问题,但没有成功。
module-info除了package-info以前存在的文件之外,Java 9 模块功能还添加了(更高级别的)文件。(源代码)文件是否可以module-info.java包含 JavaDoc 工具将提取并(有效)呈现为模块级文档的标记注释?
背景:
在我的组织中,有很多基于Java的Windows桌面应用程序。在我们专有的软件部署系统中,应用程序不包含单独的JRE / JDK。而是将通用的JRE(到目前为止,Oracle 8 Java SE JRE)部署到用户计算机,该计算机根据环境变量附加到各个应用程序。
我们希望将JRE从Oracle 8 Java SE JRE迁移到OpenJDK 11,而无需修改应用程序。从Java 8到Java 11删除了各种库,例如JavaFX。使用Java模块系统和jlink工具,我可以创建自己的专有JDK(通过OpenJFX增强):
jlink --module-path ..\mods;C:\Temp\javafx-jmods-11.0.2 --add-modules=ALL-MODULE-PATH,java.base,java.compiler,java.datatransfer,java.desktop,... --output C:\Temp\OpenJDK+OpenJFX
Run Code Online (Sandbox Code Playgroud)
需要JavaFX的应用程序可以使用此专有JDK,而无需进行更改。
当我尝试将相同的方法应用于最新的JAXB beta时,出现以下错误:
jlink --module-path ..\mods;C:\Temp\jaxb-ri-2.4.0-b180830.0438\jaxb-ri\mod --add-modules=java.xml.bind,java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,... --output C:\Workspace\Java\OpenJDK_11.0.2_JFX_JAXB
Error: automatic module cannot be used with jlink: java.activation from file:///C:/Temp/jaxb-ri-2.4.0-b180830.0438/jaxb-ri/mod/javax.activation-api.jar
Run Code Online (Sandbox Code Playgroud)
根据https://github.com/eclipse-ee4j/jaf/issues/13,“ JAXB API使用Activation-api作为其依赖项,由于缺少module-info而被迫将其用作自动模块或从类路径中使用.java描述符文件。 ”
此外,是否可以在JDK 11上使用jlink来创建包含已删除的Java SE EE模块的运行时?我可以使用Java 10中的jlink捆绑模块java.xml.bind,该模块仍包含该模块。如果我将OpenJDK 10.0.2中的两个模块添加到模块路径,则jlink确实成功:
jlink --module-path ..\mods;C:\Temp\jdk-10.0.2\jmods\java.xml.bind.jmod;C:\Temp\jdk-10.0.2\jmods\java.activation.jmod --add-modules=java.xml.bind, ...
Run Code Online (Sandbox Code Playgroud)
但是,当我使用生成的JDK运行应用程序时,出现如下错误:
!ENTRY org.eclipse.osgi 4 0 2019-02-15 15:58:58.642
!MESSAGE Application error
!STACK 1
org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotation/PostConstruct
at …Run Code Online (Sandbox Code Playgroud) 我想创建hello world java 9应用程序,并以intellij的想法启动它。
内部模块-info.java的内容:
module my.module.Second {
requires my.module.First;
}
Run Code Online (Sandbox Code Playgroud)
外部模块-info.java的内容:
module my.module.First {
exports my.pack;
}
Run Code Online (Sandbox Code Playgroud)
但是idea抱怨我的项目:
Error:(1, 1) java: too many module declarations found
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样以及真正的错误是什么。所以
我的问题是如何强迫思想接受我的世界。
PS 乍一看,错误似乎很明显,但是我有从github下载的具有相同结构的项目,但是它可以正常工作,并且想法没有抱怨:
java intellij-idea java-platform-module-system java-9 java-module
主java模块有这种问题。
rg.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名为“ldapContextSource”的bean时出错[org/springframework/boot/autoconfigure/ldap/embedded/EmbeddedLdapAutoConfiguration.class]:通过工厂方法实例化Bean失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.ldap.core.support.LdapContextSource]:工厂方法“ldapContextSource”抛出异常;嵌套异常是java.lang.IllegalAccessError:类org.springframework.ldap.core.support.AbstractContextSource(在模块spring.ldap.core中)无法访问类com.sun.jndi.ldap.LdapCtxFactory(在模块java.naming中),因为模块 java.naming 不会将 com.sun.jndi.ldap 导出到模块 spring.ldap.core
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.context@5.2.2.RELEASE/org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.2.RELEASE.jar:na]
在 spring.context@5.2.2.RELEASE/org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.2.RELEASE.jar:na]
在 spring.boot@2.2.2.RELEASE/org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.2.RELEASE.jar:na]
在 spring.boot@2.2.2.RELEASE/org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.2.RELEASE.jar:na]
在 spring.boot@2.2.2.RELEASE/org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.2.RELEASE.jar:na]
在 spring.boot@2.2.2.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.2.RELEASE.jar:na]
在 app/com.test.app.App.main(App.java:9) ~[classes/:na]
引起:org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.ldap.core.support.LdapContextSource]:工厂方法“ldapContextSource”抛出异常;嵌套异常是java.lang.IllegalAccessError:类org.springframework.ldap.core.support.AbstractContextSource(在模块spring.ldap.core中)无法访问类com.sun.jndi.ldap.LdapCtxFactory(在模块java.naming中),因为模块 java.naming 不会将 com.sun.jndi.ldap 导出到模块 spring.ldap.core
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.2.RELEASE.jar:na]
在 spring.beans@5.2.2.RELEASE/org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.2.RELEASE.jar:na]
... 17个常用帧省略
引起:java.lang.IllegalAccessError:类org.springframework.ldap.core.support.AbstractContextSource(在模块spring.ldap.core中)无法访问类com.sun.jndi.ldap.LdapCtxFactory(在模块java.naming中),因为模块 java.naming 不会将 … 在介绍 JPMS 服务时,Java 语言规范的 7.7.4 节指出“服务类型必须是类类型、接口类型或注释类型”。
我正在努力理解允许注释的意义。我的理解是服务的 JPMS 概念是我们期望在运行时选择实现的东西。看起来,为了有用,实现至少需要有可能是不同于标识所请求服务的原始类的东西。但我相信注释不能使用“扩展”,所以这永远不会发生?从那以后,我相信如果我尝试使用注释类型创建服务,我将不可避免地遇到这样一种情况,即服务查找可能返回的唯一内容,例如 SomeAnnotation。类将完全是 SomeAnnotation。这似乎毫无意义,所以我必须假设我错过了一些东西。
任何人都可以阐明这一点,也许可以提供注释如何成为“服务”的示例?
如何在测试运行时将我的测试添加到我的生产代码中,以便它们都在同一个 Java 9 模块中并且可以使用反射相互访问?
到目前为止我已经尝试过:
module-info.java)→ 它运行良好,但不是我想要的。--patch-module到其他文件夹几乎增加(到一个指定使用--module-path)→将其与“正常”的代码工作,但不与反射,它没有找到指定的类--module-path。
--patch-module→指定我的测试和生产代码,它只会在我首先指定的文件夹中找到类。--add-opens mymodule/mypackge=mymodule或...=ALL-UNNAMED打开它进行反射 → 看起来没有任何效果。所以我的完整测试线是:
java \
--patch-module com.stackoverflow.examplemodule=ModuleInfoTest:ModuleInfoExample \
--module-path ModuleInfoExample \
--add-opens com.stackoverflow.examplemodule/com.stackoverflow.examplepackage=com.stackoverflow.examplemodule \
--add-opens com.stackoverflow.examplemodule/com.stackoverflow.examplepackage=ALL-UNNAMED \
--module com.stackoverflow.examplemodule/com.stackoverflow.examplepackage.Main
Run Code Online (Sandbox Code Playgroud)
我在一个包含以下子目录和文件的目录中:
我正在使用:
openjdk version "13.0.2" 2020-01-14
OpenJDK Runtime Environment (build 13.0.2+8)
OpenJDK 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
正如我从批准的答案中了解到的那样,我的问题并不是真正的“访问其他课程”,正如我所说的那样。但更像是找到它们(通过扫描类路径/模块路径)。然而,这部分已经在另一个 StackOverflow 问题中 …
java ×10
java-module ×10
java-9 ×6
java-11 ×3
jaxb ×2
applet ×1
classpath ×1
eclipse ×1
java-platform-module-system ×1
javadoc ×1
ldap ×1
log4j2 ×1
maven ×1
module ×1
module-info ×1
spring-ldap ×1