标签: java-platform-module-system

带有加密提供程序的签名模块化 JAR 无法链接到运行时映像

我正在尝试使用 jlink 工具来构建一个 java 可执行文件。我按以下方式使用它:

jlink.exe --module-path <path-to-modules> --add-modules <my-module-name> --output dist --launcher launch=org.demo/org.demo.Main --strip-debug --compress 2 --no-header-files --no-man-pages
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误:

Error: signed modular JAR <path-to-modules>\bcprov.jdk15on.jar is currently not supported, use --ignore-signing-information to suppress error
Run Code Online (Sandbox Code Playgroud)

当我添加“--ignore-signing-information”选项时,它可以很好地构建我的可执行文件,但它给了我以下警告:

WARNING: signed modular JAR <path-to-modules>\bcprov.jdk15on.jar is currently not supported
Run Code Online (Sandbox Code Playgroud)

然后,当我执行已经构建的可执行文件时,我收到以下异常:

org.apache.sshd.common.SshException: Failed (NoSuchProviderException) to execute: JCE cannot authenticate the provider BC
    at sshd.core/org.apache.sshd.common.future.AbstractSshFuture.verifyResult(Unknown Source)
    at sshd.core/org.apache.sshd.client.future.DefaultAuthFuture.verify(Unknown Source)
    at sshd.core/org.apache.sshd.client.future.DefaultAuthFuture.verify(Unknown Source)
Caused by: java.util.jar.JarException: Non-Oracle JCE providers may not be linked into the image,they must be …
Run Code Online (Sandbox Code Playgroud)

jar-signing jlink java-platform-module-system java-9 java-module

6
推荐指数
1
解决办法
358
查看次数

包 x 在未命名模块中声明,但模块 x 不读取它

我想使用 netbeans 迁移到 Java 11 和 JFX11。JFX11 必须用作模块,所以我添加了 JavaFX jars 并在默认包文件夹下的 module-info.java 中添加了以下内容。

requires javafx.controls;
requires javafx.base;
requires javafx.fxml;
requires javafx.graphics;
requires javafx.swing;

requires java.logging;
requires java.desktop;
requires java.sql;
requires java.xml;
Run Code Online (Sandbox Code Playgroud)

这导致我的所有其他依赖项显示“pacakges 'xyz' 不可见......(包 'xyz' 在未命名的模块中声明,但模块 'xyz' 不读取它)”当我尝试清理和9.在netbeans中构建

我不能混合模块和库吗?我错过了什么?

java javafx java-platform-module-system java-module javafx-11

6
推荐指数
0
解决办法
3990
查看次数

Java 平台模块系统是否减少了 JAR 的大小?

这里描述了 Jigsaw 的以下好处:

作为 Project Jigsaw 的一部分,所有 Java 平台 API 都已拆分为单独的模块。将所有 Java API 拆分为模块的好处是您现在可以指定应用程序需要的 Java 平台模块。知道您的应用程序需要哪些 Java 平台模块,Java 可以打包您的应用程序,仅包括您的应用程序实际使用的 Java 平台模块。

但是,我不明白它是如何工作的,因为据我所知,Java 并没有所需的模块直接放在 JAR 中。它只是在模块路径中寻找它们。那么,Java 是如何减少 JAR 大小的呢?

java jar java-platform-module-system java-9

6
推荐指数
1
解决办法
671
查看次数

为什么模块路径上的模块需要 --add-modules ?

一个例子:由于 JavaFx 从 JDK 中删除,JavaFx SDK 现在作为一组模块化 jar 分发。要编译 JavaFx 应用程序,当然必须将它们放在模块路径中:

javac -p /path/to/jars/ App.java
Run Code Online (Sandbox Code Playgroud)

然而,这还不够。尝试编译会导致很多类似的错误

sample/App.java:3: error: package javafx.application is not visible
import javafx.application.Application;
             ^
  (package javafx.application is declared in module javafx.graphics, which is not in the module graph)
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我们可以使用 --add-modules 添加 javafx.graphics:

javac -p /path/to/jars/ --add-modules javafx.graphics App.java
Run Code Online (Sandbox Code Playgroud)

但是,如果我们将 module-info.java(仅包含module ui {})添加到项目中,则没有问题。

为什么模块路径上的模块对命名模块可见,但对未命名模块不可见?

java java-platform-module-system java-9 java-module java-11

6
推荐指数
1
解决办法
4102
查看次数

SBT 可以使用 java 11 模块路径来实现项目依赖吗?

我使用SBT构建了一个纯java项目。该项目由多个模块组成,projectB依赖于projectA。现在,在切换到JDK 11后,这种依赖关系不应通过类路径建模,而应通过模块路径建模。是否可以告诉SBT模块依赖性必须通过模块路径而不是路径来解决?基本上我已经设置了一个(sbt-)模块间依赖关系,它说projB.dependsOn(projA)- 那么我可以告诉SBT以某种方式将此依赖关系放在 javac模块路径上而不是使用类路径吗?我认为目前没有办法做到这一点。

编辑:进一步分析表明,我还需要使用正常的库依赖项(来自 Nexus 存储库上的库)作为模块依赖项。所以下一个问题是 - 如何将这些库依赖项视为SBT中的模块依赖项?

我确实知道SBT是一个scala构建工具,并且将它用于纯 java 项目有些牵强,但我将SBT用于其他(scala-)项目,并且我不想介绍太多不同的构建工具,直到我真的必须这样做。那么,有没有 sbt 级别的解决方案呢?

编辑:为了澄清这个问题 - 有问题的项目是我们修改的一种开源库。SBT 构建文件来自我们的组织,所以我必须维护它。该项目切换为使用 module-info 类,并且它通过模块路径依赖于其他(仅限二进制)库,也就是说,如果您在编译中包含 module-info.java 。

因此,在我们的 SBT 构建中,我必须使用某些外部库依赖项的模块路径。此外,SBT 子项目相互依赖,即我们还必须使用模块路径。有没有办法告诉 SBT:

  • 该库必须位于模块路径上,而不是类路径上
  • 该项目依赖项必须位于模块路径上,而不是通过类路径?

这就是问题的核心。我也许可以为第一个问题编写一个插件(例如,没有库依赖性,而是模块化库依赖性) - 但我还不知道如何处理第二部分(告诉项目项目依赖性必须位于模块路径上并且不在类路径上)。

java sbt java-platform-module-system

6
推荐指数
0
解决办法
533
查看次数

使用 gradle 依赖 Java 9 模块系统库中的遗留 jar

问题

如何创建一个 java 库 jar 来:

  • 是java模块(有module-info
  • 有一个依赖的遗留(非模块)jar。(喜欢commons-exec)?

依赖项是一个实现细节 - 不应导出。

来源

具有以下条件build.gradle(使用gradle-6.8):

plugins {
    id 'java-library'
}

group = 'test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '15'

repositories {
    mavenCentral()
}
java {
    modularity.inferModulePath = true
}

dependencies {
    implementation 'org.apache.commons:commons-exec:1.3'
}
Run Code Online (Sandbox Code Playgroud)

以及以下内容module-info.java

module test.module {
    requires commons.exec;
}
Run Code Online (Sandbox Code Playgroud)

错误

我收到以下编译错误:

module-info.java:2: error: module not found: commons.exec
    requires commons.exec;
                    ^
Run Code Online (Sandbox Code Playgroud)

如果我不包含,requires commons.exec则错误将变为:

error: package org.apache.commons.exec is not visible …
Run Code Online (Sandbox Code Playgroud)

java gradle java-platform-module-system java-9 unnamed-module

6
推荐指数
1
解决办法
2658
查看次数

如何使用散列名称调试 Java 运行时未命名模块错误

我对模块化 Java 的兴趣已经几个月了,包括 Spring 和相关的生态系统内容。最令人沮丧的经历之一是调试名称不明确的模块问题

这是我遇到的最后一个此类错误:

java.lang.IllegalAccessError: superclass access check failed: class com.oracle.truffle.polyglot.PolyglotImpl (in unnamed module @0x58a90037) cannot access class org.graalvm.polyglot.impl.AbstractPolyglotImpl (in module org.graalvm.sdk) because module org.graalvm.sdk does not export org.graalvm.polyglot.impl to unnamed module @0x58a90037

@0x58a90037问题就在这里。

根据我要做的事情,我会随机尝试spring.beansspring.context等等javax.validation......并向世界开放我的模块,这在某种程度上消除了首先封装它们的价值。

对于这个具体案例,我尝试过requires org.graalvm.sdk;虽然进展并不顺利,但还是requires org.graalvm.js;做到了。

通过随机尝试进行调试似乎并不是解决这些问题的明智方法。所以我想知道你们是怎么做到的。

谢谢你!

java java-platform-module-system java-module java-17

6
推荐指数
0
解决办法
455
查看次数

Spring项目的Java 9 Jigsaw(模块)有什么计划?

Java 9计划不久(7月27日)发布。是否有计划发布将模块化的Spring项目的Java 9兼容版本(Java 9项目Jigsaw)?

spring java-platform-module-system spring-boot java-9 java-module

5
推荐指数
1
解决办法
4404
查看次数

在Java 9模块路径和类路径之间拆分Gradle依赖项:自动模块

我遵循了Gradle指南来构建Java 9模块,从而使一个简单的基于Java 9的库项目成为现实。特别是,我按照指南中的建议手动设置了模块路径,如下所示:

ext.moduleName = 'com.foo.bar' 

compileJava {
    inputs.property("moduleName", moduleName)
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
        ]
        classpath = files()  
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这只是获取我的整个类路径(由Gradle从我的依赖图中确定),并将其移到模块路径中。

除了一个简单的问题以外,一切工作都很好。我的某些依赖项(例如 org.jetbrains.kotlin:kotlin-stdlib-1.2.10)不是真正的Java 9模块,因为它们缺少module-info.class。它的优良坚持他们的类路径上模块路径,因为,现在java将它们转换成所谓的自动模块

问题就出现了,因为即使是一个自动模块,如果是我的模块的道路上,我需要参考它在requires指令中我的项目的模块。但是由于我-Xlint:all选择了Java编译器,因此会javac产生以下警告:

/path/to/myproject/foo-module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
    requires kotlin.stdlib;
                   ^
Run Code Online (Sandbox Code Playgroud)

这个警告对我来说是站不住脚的,因为我也随该-Werror javac标志滚动,因此它使我的构建失败。

因此,似乎我需要将自动模块推送到我的类路径上,并仅在模块路径上保留“ true”模块依赖项...

是否有任何通用或半通用的方式(未与依赖项名称耦合)在编译器类路径及其模块路径之间拆分我的依赖项?

classpath gradle java-platform-module-system java-9 module-path

5
推荐指数
0
解决办法
675
查看次数

如果目标级别为8,我可以使用module-info.java吗?

我知道module_info.java被jdk9 +识别

我不知道module-info.java是否仍然可以与目标等级8结合使用.

例如,我希望我的库在java9 +项目中使用,它将把它识别为导出特定包的模块,但也可以在java8项目中用作普通的jar文件.

java java-platform-module-system java-9 module-info multi-release-jar

5
推荐指数
1
解决办法
206
查看次数