Java 9(特别是Jigsaw)中是否有任何计划来支持Java监视代理程序的特殊要求?
通常,监视代理程序需要能够访问默认情况下不可用于原始Java应用程序的类,包和模块.通过-javaagent命令行参数加载到JVM中的监视代理程序不会作为模块加载,即使jar文件包含module-info.class文件也是如此.我能够为监控代理提供所需权限的唯一方法是添加命令行参数,为所有未命名的模块提供这些权限.
我有一个项目.最初它是一个单一的模块项目,结构如此
java-cloud-sample\
src\
main\
java
pom.xml
Run Code Online (Sandbox Code Playgroud)
我决定将它变成一个多模块结构 - java 9
无论如何我都会使用它.所以我把它分开了
java-cloud-sample\
java-cloud-rest-api\
src\
pom.xml
pom.xml
Run Code Online (Sandbox Code Playgroud)
root pom.xml
看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lapots.breed.platform.cloud</groupId>
<artifactId>java-cloud-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>java-cloud-rest-api</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.9</maven.compiler.source>
<maven.compiler.target>1.9</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals><goal>copy-dependencies</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
模块pom.xml
看起来像这样
<?xml version="1.0" …
Run Code Online (Sandbox Code Playgroud) 只是探索Java的新版本,它的新模块系统,以及使用jshell.可能我的问题没有多大意义,但我只是好奇.
所以我想出了一个问题:有没有办法在jshell中创建一个模块?或模块只能创建module-info.java
?
我试图通过限制它包含的模块来减少我的应用程序的大小.我已经为我的运行时使用了这个jlink
.然而,当我运行javapackager
使用--add-modules
,并--limit-modules
选择用逗号分隔的相同的小套我用于运行时模块的列表,它坚持将所有模块的反正.它似乎不想尊重我给它的选项.如何获得该工具来限制它添加到我的应用程序包中的模块?
"Adding modules: [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging,
java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets, jdk.xml.dom,
java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec,
jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject, jdk.sctp, java.smartcardio,
jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink,
javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr, jdk.packager.services, jdk.net, javafx.controls,
java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management,
jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata] to runtime image."
outputDir = ...
modulePath = [/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/jmods]
addModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, …
Run Code Online (Sandbox Code Playgroud) 将Maven项目升级到Java 9并添加模块描述符后,javac
抱怨自动模块的传递依赖:
[警告] /.../scrc/main/java/module-info.java:[3,35]
requires transitive
自动模块指令
module-info.java
重现问题的一个例子:
module com.example.mymodule {
exports com.example.mymodule.myexportedpackage;
requires transitive com.google.common;
}
Run Code Online (Sandbox Code Playgroud)
这个警告的含义是完全清楚的,这里有一些相关的链接:
问题是 - 如何在不修复实际问题的情况下抑制此警告,并且不禁用所有其他javac
警告?
我尝试了以下选项,但它们都没有奏效:
@SuppressWarnings("module")
在 module-info.java
@SuppressWarnings("all")
在 module-info.java
-Xlint:all,-module
命令行选项不幸的是,我无法修复实际问题(现在),因为"my"模块具有来自第三方(自动)模块(例如Guava)的返回类型和注释.因此,如果我使用"require com.google.common"(不带transitive
),则会有不同的警告,例如:
[WARNING] .../MyClass.java:[25,20]
com.google.common.collect.Table
模块中的类com.google.common
不是间接导出的requires transitive
当然,我无法为第三方库定义模块描述符(现在是自动模块).
我正在使用-Werror
我想保留的,所以警告不仅仅是烦人的......
PS我不打算将我的工件发布到任何公共存储库.
使用JDK/11的早期访问构建来编译基于使用VM参数的Java-9的现有代码
--add-modules jdk.incubator.httpclient
Run Code Online (Sandbox Code Playgroud)
解决HTTP/2客户端孵化器模块 现在最终出现编译错误
找不到模块:jdk.incubator.httpclient
Java版本详细信息: -
Run Code Online (Sandbox Code Playgroud)java 11-ea 2018-09-25 Java(TM) SE Runtime Environment 18.9 (build 11-ea+11) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-ea+11, mixed mode)
我有一个读取系统属性的类加载器应用程序 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
选项。只需要路径值。
module-info.java
当我运行 gradle 时,没有找到我声明的所有必需模块:
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:10: error: module not found: com.jfoenix
requires com.jfoenix;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:11: error: module not found: google.api.client
requires google.api.client;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:12: error: module not found: google.api.services.gmail.v1.rev83
requires google.api.services.gmail.v1.rev83;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:13: error: module not found: google.http.client
requires google.http.client;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:14: error: module not found: google.http.client.jackson2
requires google.http.client.jackson2;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:15: error: module not found: google.oauth.client
requires google.oauth.client;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:16: error: module not found: google.oauth.client.java6
requires google.oauth.client.java6;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:17: error: module not found: google.oauth.client.jetty
requires google.oauth.client.jetty;
^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:18: error: module not …
Run Code Online (Sandbox Code Playgroud) 当我们通过JLINK创建Java运行时需要的所有Java类/资源,并把它们变成JRT映像文件:lib/modules
。
这是我使用的基本 Maven 项目资源结构:
src
main
resources
dict
xkcd_en
Run Code Online (Sandbox Code Playgroud)
我只是想阅读xkcd_en
文本文件。如果我们查看 JRT 文件,它是:
>> jimage list /path/to/lib/modules
...
Module: main
dict/xkcd_en
...
Run Code Online (Sandbox Code Playgroud)
此外,我已明确在 中打开它module-info
,以防万一:
module main {
opens dict;
// ..rest code omitted
}
Run Code Online (Sandbox Code Playgroud)
我可以读取文件的唯一方法是将其作为输入流获取:
作品:
public static InputStream getResourceAsStream(String resource) {
return FileUtils.class.getResourceAsStream(resource);
}
System.out.println(new BufferedReader(
new InputStreamReader(getResourceAsStream("/dict/xkcd_en")))
.lines().collect(Collectors.joining("\n"))
);
Run Code Online (Sandbox Code Playgroud)
不工作:
但是,如果我试图获取文件 URI 并通过 Java NIO API 读取它,则它不起作用:
public static URL getResourceOrThrow(String resource) {
URL url = FileUtils.class.getResource(resource);
Objects.requireNonNull(url);
return url;
}
Run Code Online (Sandbox Code Playgroud)
1 - …
我正在尝试使用JPMS模块将JavaFX,Spring Boot和VLCJ结合在一起。如果没有Spring Boot,则在我的module-info.java
文件中一切正常:
module myapplication.module {
requires javafx.controls;
requires javafx.fxml;
requires javafx.web;
requires vlcj;
requires org.kordamp.iconli.core;
requires org.kordamp.ikonli.javafx;
requires org.kordamp.ikonli.fontawesome5;
exports com.company.app;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果现在结合使用Spring Boot,则我将其更新module-info.java
为包括Spring相关模块:
requires spring.beans;
requires spring.context;
requires spring.core;
requires spring.boot.autoconfigure;
requires spring.boot;
Run Code Online (Sandbox Code Playgroud)
但是,我在运行时遇到此异常:
java.lang.NoSuchMethodError: com.sun.jna.Native.load(Ljava/lang/String;Ljava/lang/Class;)Lcom/sun/jna/Library;
at vlcj.natives@4.1.0/uk.co.caprica.vlcj.binding.LibC.<clinit>(LibC.java:38)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.strategy.OsxNativeDiscoveryStrategy.setPluginPath(OsxNativeDiscoveryStrategy.java:72)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.strategy.BaseNativeDiscoveryStrategy.onSetPluginPath(BaseNativeDiscoveryStrategy.java:126)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.NativeDiscovery.tryPluginPath(NativeDiscovery.java:176)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.discovery.NativeDiscovery.discover(NativeDiscovery.java:117)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.MediaPlayerFactory.discoverNativeLibrary(MediaPlayerFactory.java:187)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.MediaPlayerFactory.<init>(MediaPlayerFactory.java:119)
at vlcj@4.2.0/uk.co.caprica.vlcj.factory.MediaPlayerFactory.<init>(MediaPlayerFactory.java:174)
at myapplication.module/com.company.app.MyApplication.mediaPlayerFactory(MyApplicationConfiguration.java:18)
at myapplication.module/com.company.app.MyApplication$$EnhancerBySpringCGLIB$$702eae01.CGLIB$mediaPlayerFactory$0(<generated>)
at myapplication.module/com.company.app.MyApplication$$EnhancerBySpringCGLIB$$702eae01$$FastClassBySpringCGLIB$$af782040.invoke(<generated>)
at spring.core@5.1.9.RELEASE/org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at spring.context@5.1.9.RELEASE/org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
at myapplication.module/com.company.app.MyApplication$$EnhancerBySpringCGLIB$$702eae01.mediaPlayerFactory(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at …
Run Code Online (Sandbox Code Playgroud) java-module ×10
java ×9
java-9 ×6
java-11 ×3
agent ×1
classpath ×1
gradle ×1
http2 ×1
javac ×1
javapackager ×1
jshell ×1
maven ×1
module-info ×1
module-path ×1
monitoring ×1
nio ×1
spring-boot ×1
vlcj ×1