标签: java-module

Java 9 Jigsaw支持javaagent

Java 9(特别是Jigsaw)中是否有任何计划来支持Java监视代理程序的特殊要求?

通常,监视代理程序需要能够访问默认情况下不可用于原始Java应用程序的类,包和模块.通过-javaagent命令行参数加载到JVM中的监视代理程序不会作为模块加载,即使jar文件包含module-info.class文件也是如此.我能够为监控代理提供所需权限的唯一方法是添加命令行参数,为所有未命名的模块提供这些权限.

monitoring agent java-9 java-module

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

致命错误编译无效标志 - 模块路径

我有一个项目.最初它是一个单一的模块项目,结构如此

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 maven java-9 java-module module-path

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

在Java 9中使用JShell创建模块

只是探索Java的新版本,它的新模块系统,以及使用jshell.可能我的问题没有多大意义,但我只是好奇.

所以我想出了一个问题:有没有办法在jshell中创建一个模块?或模块只能创建module-info.java

java java-9 jshell java-module

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

限制由javapackager添加的模块

我试图通过限制它包含的模块来减少我的应用程序的大小.我已经为我的运行时使用了这个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)

java java-9 javapackager java-module

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

如何正确地抑制"需要自动模块的传递指令"警告?

将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我不打算将我的工件发布到任何公共存储库.

java javac java-9 java-module

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

Java11中找不到jdk.incubator.httpclient模块

使用JDK/11早期访问构建来编译基于使用VM参数的Java-9现有代码

--add-modules jdk.incubator.httpclient
Run Code Online (Sandbox Code Playgroud)

解决HTTP/2客户端孵化器模块 现在最终出现编译错误

找不到模块:jdk.incubator.httpclient

Java版本详细信息: -

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)
Run Code Online (Sandbox Code Playgroud)

java http2 java-module java-11

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

如何在 JDK 9 或更高版本中获取引导类路径

我有一个读取系统属性的类加载器应用程序 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 classpath bootclasspath java-9 java-module

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

在 module-info.java 中找不到所需的模块

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)

java gradle java-module module-info java-11

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

Java NIO 无法从 JRT 映像读取文件

当我们通过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 - …

java nio java-module java-11

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

使用Java 9模块(JPMS)时java.lang.NoSuchMethodError

我正在尝试使用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 vlcj spring-boot java-module

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