我正在尝试使用 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
我想使用 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
这里描述了 Jigsaw 的以下好处:
作为 Project Jigsaw 的一部分,所有 Java 平台 API 都已拆分为单独的模块。将所有 Java API 拆分为模块的好处是您现在可以指定应用程序需要的 Java 平台模块。知道您的应用程序需要哪些 Java 平台模块,Java 可以打包您的应用程序,仅包括您的应用程序实际使用的 Java 平台模块。
但是,我不明白它是如何工作的,因为据我所知,Java 并没有将所需的模块直接放在 JAR 中。它只是在模块路径中寻找它们。那么,Java 是如何减少 JAR 大小的呢?
一个例子:由于 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 {})添加到项目中,则没有问题。
为什么模块路径上的模块对命名模块可见,但对未命名模块不可见?
我使用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 库 jar 来:
module-info)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
我对模块化 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.beans,spring.context等等javax.validation......并向世界开放我的模块,这在某种程度上消除了首先封装它们的价值。
对于这个具体案例,我尝试过虽然进展并不顺利,但还是requires org.graalvm.sdk;requires org.graalvm.js;做到了。
通过随机尝试进行调试似乎并不是解决这些问题的明智方法。所以我想知道你们是怎么做到的。
谢谢你!
Java 9计划不久(7月27日)发布。是否有计划发布将模块化的Spring项目的Java 9兼容版本(Java 9项目Jigsaw)?
spring java-platform-module-system spring-boot java-9 java-module
我遵循了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
我知道module_info.java被jdk9 +识别
我不知道module-info.java是否仍然可以与目标等级8结合使用.
例如,我希望我的库在java9 +项目中使用,它将把它识别为导出特定包的模块,但也可以在java8项目中用作普通的jar文件.
java java-platform-module-system java-9 module-info multi-release-jar
java-platform-module-system ×10
java ×7
java-9 ×7
java-module ×5
gradle ×2
classpath ×1
jar ×1
jar-signing ×1
java-11 ×1
java-17 ×1
javafx ×1
javafx-11 ×1
jlink ×1
module-info ×1
module-path ×1
sbt ×1
spring ×1
spring-boot ×1