我正在尝试使用 maven 在 java 9 中构建一个使用依赖项的演示项目:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.10</artifactId>
<version>2.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是,当我运行 jar 工具来确定要在项目的 module-info.java 中使用的自动模块名称时,出现以下错误:
$ jar --file=spark-mllib_2.10/2.2.0/spark-mllib_2.10-2.2.0.jar --describe-module
Unable to derive module descriptor for: spark-mllib_2.10/2.2.0/spark-mllib_2.10-2.2.0.jar
spark.mllib.2.10: Invalid module name: '2' is not a Java identifier
Run Code Online (Sandbox Code Playgroud)
看来自动模块算法无法为该 jar 提供有效的 java 名称。如果没有添加正确的需求,我会收到 Spark mllib 中缺少软件包的编译错误,例如:
package org.apache.spark.mllib.linalg does not exist
Run Code Online (Sandbox Code Playgroud)
在添加官方保留模块名称或其自己的模块信息之前,我是否可以在项目中使用此依赖项?
我试图从模块类调用非模块类。我创建了一个文件夹结构
moduledemo > allclasses > moduleC > packageC > MyMethods.class
Run Code Online (Sandbox Code Playgroud)
是我的模块类文件的路径
moduledemo > moduleC > packageC > MyMethods.java
Run Code Online (Sandbox Code Playgroud)
和
moduledemo > nomodule > packageD > DemoNoModule.class
Run Code Online (Sandbox Code Playgroud)
是我调用的无模块类MyMethods.java
我能够编译 DemoNoModule 文件。我能够将 MyMethods.java 编译到 allclasses 文件夹中moduleC。
当我运行 MyMethods 时,出现错误moduleC not found。有人可以更新吗?我正在使用以下命令来运行
java --module-path allclasses -m moduleC/packageC.MyMethods
Run Code Online (Sandbox Code Playgroud)
两个文件代码 -> 非模块类
package packageD;
public class DemoNoModule {
public void showD() {
System.out.println("this is show of D in No Module");
}
}
Run Code Online (Sandbox Code Playgroud)
模块类调用类
package packageC;
import packageD.*;
public class MyMethods …Run Code Online (Sandbox Code Playgroud) java.util.regex.Matcher在覆盖本机类(例如在非模块化代码库中)时,如何使用自定义类路径。
基本上我想做的是使用不同的类路径,就像--class-path build/custom修补类时一样。因为修改后的 Matcher.java 引用了编译为build/custom.
假设我已经修改了java.util.regex.Matcher,现在它需要一些其他(非 java)external.jar 才能运行。
那么我怎样才能像这样修补它:
javac --patch-module java.base=src,以便它也找到 external.jar 中的类。
目录结构:
+- build
+- src
+- PATCH
+- java
+- util
+- regex
+- Matcher.java
+- CUSTOM
+- com
+- example
+- MyClass.java
Run Code Online (Sandbox Code Playgroud)
两个类如下:
java.util.regex.Matcher:
package java.util.regex;
class Matcher {
com.example.MyClass myClass;
}
Run Code Online (Sandbox Code Playgroud)
com.example.MyClass:
package com.example;
public class MyClass {
}
Run Code Online (Sandbox Code Playgroud)
情况1
这有效:
javac -d build src/CUSTOM/com/example/MyClass.java
javac -d build --patch-module java.base=src src/PATCH/java/util/regex/Matcher.java
Run Code Online (Sandbox Code Playgroud)
案例#2
但是如果我将 MyClass …
是否可以Launch4j使用模块化 Java 应用程序制作捆绑/包装 exe 文件?
该应用程序是模块化(jmods),与出口jlink,它不产生任何广口瓶,但custom runtime image与运行命令一个bat文件(几个文件夹):java -m package/path.to.class
我读了Launch4j docs,它说 jar 标签是可选的。尝试将程序与 gui(它甚至没有启用“运行”按钮)和 Windows cmd(launch4j:应用程序 jar 不存在。)一起使用。
编辑1:
这个SO帖子与我的问题有关。Launch4j 还没有这个功能。
解决方案(直到没有其他工具能够这样做):
使用 java custon 运行时映像制作 7z 文件:
7z a "outputPath\fileName.7z" "inputPath\javaCustomImgFolder"
Run Code Online (Sandbox Code Playgroud)使用这些参数创建一个config.txt 文件:
;!@Install@!UTF-8!
Title="Your app name" //dont know where it's shown.
BeginPrompt="Do you want to install This Program?" //same
RunProgram="your.exe" //7z automatically search a .exe
Directory="bin" //play with the path if you …Run Code Online (Sandbox Code Playgroud)我的问题:如何设置模块路径gradle build?
我已经习惯从命令行使用 Java 模块了。我经常在 Powershell 中进行练习,从而生成这些源文件。
????src
????appMod
? ? module-info.java
? ?
? ????appPack
? Entry.java
?
????greetMod
? module-info.java
?
????greetPack
Hello.java
Run Code Online (Sandbox Code Playgroud)
module appMod {
requires greetMod;
}
Run Code Online (Sandbox Code Playgroud)
package appPack;
import greetPack.Hello;
public class Entry {
public static void main(String[] args) {
System.out.println(new Hello().sayHello());
}
}
Run Code Online (Sandbox Code Playgroud)
module greetMod {
exports greetPack;
}
Run Code Online (Sandbox Code Playgroud)
package greetPack;
public class Hello {
public String sayHello() {
return "Greetings from Hello class!";
}
}
Run Code Online (Sandbox Code Playgroud)
由于appMod 模块需要greetMod,所以我先编译并jar …
所以,我正在尝试将一个工具从 Java 8 迁移到 Java 11。
我做了第一步,让它在没有模块的情况下工作并且代码成功编译。
现在我正在尝试添加 module-info.java,但由于我的工具中使用的库,我首先遇到了问题。有些已经与 Java 11(例如 Lombok)兼容,但有些则不兼容,因此我尝试使用requires和 artifactId 名称导入它们。
但是由于我的 Maven 模型和 Maven 模型构建器依赖性,我似乎卡住了,因为我在构建时遇到以下错误:
[ERROR] the unnamed module reads package org.apache.maven.model.merge from both maven.model.builder and maven.model
[ERROR] module maven.model.builder reads package org.apache.maven.model.merge from both maven.model.builder and maven.model
[ERROR] module maven.model reads package org.apache.maven.model.merge from both maven.model.builder and maven.model
Run Code Online (Sandbox Code Playgroud)
对于这种错误,我该怎么办?似乎我需要两者(如果我评论一个或另一个,构建仍然失败)。这是否意味着我无法将模块添加到我的工具中?
注意:库设置为最新版本(即 3.6.3)
我正在为该应用程序开发一个应用程序(https://github.com/stirante/RuneChanger)和一个库(https://github.com/stirante/lol-client-java-api)。在库中,我使用 Java-WebSocket,它最近添加了 SLF4J API。在应用程序中,我有 logback 作为依赖项,它也有 SLF4J 作为依赖项。
在编译应用程序时,我有这样的错误:
[ERROR] the unnamed module reads package org.slf4j.spi from both slf4j.api and lol.client.java.api
[ERROR] the unnamed module reads package org.slf4j from both slf4j.api and lol.client.java.api
[ERROR] the unnamed module reads package org.slf4j.helpers from both slf4j.api and lol.client.java.api
[ERROR] the unnamed module reads package org.slf4j.event from both slf4j.api and lol.client.java.api
Run Code Online (Sandbox Code Playgroud)
完整日志在这里:https : //travis-ci.org/github/stirante/RuneChanger/builds/693607053
我尝试移动库中的依赖项(https://github.com/stirante/lol-client-java-api/commit/f62c31f02ace86d50546af113a94fa37f814fb98),但没有运气。
我该如何处理这种情况?
编辑:暂时我转移org.slf4j到另一个包并且它可以工作,但它看起来像一个丑陋的解决方案,因为日志记录可能无法从这个库中工作。
我正在将旧的 Java 应用程序转换为模块化的应用程序。它是一个 Gradle 项目,依赖项如下所示:
dependencies {
implementation 'org.jopendocument:jOpenDocument:1.3'
implementation 'xom:xom:1.3.2'
}
Run Code Online (Sandbox Code Playgroud)
在 App 类中,我的导入是:
dependencies {
implementation 'org.jopendocument:jOpenDocument:1.3'
implementation 'xom:xom:1.3.2'
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个 module-info.java 文件。但是当我这样做时,我的应用程序将无法编译,因为requiresmodule-info 文件中的指令是错误的。
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Serializer;
import org.jopendocument.dom.spreadsheet.MutableCell;
import org.jopendocument.dom.spreadsheet.Sheet;
import org.jopendocument.dom.spreadsheet.SpreadSheet;
Run Code Online (Sandbox Code Playgroud)
模块名称xom和jOpenDocument不足。但是我不知道这些依赖项应该是什么,也不知道如何重新配置 Gradle;如果那是我需要做的。
当我省略任一requires语句时,相应的imports 无法解析。我没有查看 JAR 文件。但我不认为任何一个工件是模块化的。
我正在使用 Gradle 5.6.2,我的目标是 Java 11。
java java-platform-module-system java-module module-info java-11
本地 Java 版本是:
java version "11.0.7" 2020-04-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.7+8-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.7+8-LTS, mixed mode)
Run Code Online (Sandbox Code Playgroud)
但我的项目有 Java 版本:
<java.version>1.8</java.version>
Run Code Online (Sandbox Code Playgroud)
在构建过程中,我收到一个错误:
Exit code: 1 - javadoc: error - The code being documented uses modules but the packages defined in https://docs.oracle.com/javase/8/docs/api/ are in the unnamed module.
Run Code Online (Sandbox Code Playgroud)
如何在不将 pom 的 Java 版本更改为 Java 11 或降级到 Java 8 的情况下解决?
我使用的命令行XJC从jaxb-ri 2.3.3Maven构件
(https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/2.3.3/jaxb-ri-2.3.3。邮编)。
似乎无法加载剧集插件(更准确地说,ServiceLoader在 xjc 的插件架构中的幕后使用的根本找不到它):
unrecognized parameter -episode
Run Code Online (Sandbox Code Playgroud)
在 linux 和 windows 上的 openjdk-11.0.2 上进行了测试。
需要做些什么来解决这个问题?谢谢!
java ×10
java-module ×10
java-9 ×5
java-11 ×4
java-platform-module-system ×2
maven ×2
command-line ×1
dependencies ×1
gradle ×1
java-8 ×1
javac ×1
javadoc ×1
jaxb ×1
jlink ×1
launch4j ×1
module-info ×1
slf4j ×1
xjc ×1