Java 如何重新包装JDK9';s模块

Java 如何重新包装JDK9';s模块,java,java-9,jlink,Java,Java 9,Jlink,我试图在Windows 10下的管理员命令行中重新打包JDK_ROOT\lib\模块,但收到错误消息: //first extract modules's content "C:\Program Files\Java\jdk-9.0.4\bin\jimage.exe" extract --dir="C:\Program Files\Java\jdk-9.0.4\lib\modules-extracted" "C:\Program Files\Java\jdk-9.0.4\lib\modules

我试图在Windows 10下的管理员命令行中重新打包JDK_ROOT\lib\模块,但收到错误消息:

//first extract modules's content
"C:\Program Files\Java\jdk-9.0.4\bin\jimage.exe"  extract --dir="C:\Program Files\Java\jdk-9.0.4\lib\modules-extracted" "C:\Program Files\Java\jdk-9.0.4\lib\modules" 

//try to repackage it and only contains java.base
"C:\Program Files\Java\jdk-9.0.4\bin\jlink.exe" -v --output "C:\Program Files\Java\jdk-9.0.4\lib\modules-repackaged"  --module-path "C:\Program Files\Java\jdk-9.0.4\lib\modules-extracted" --add-modules java.base

//error:
jdk.tools.jlink.plugin.PluginException: Resource /java.base/java/lang/invoke/BoundMethodHandle$Species_D.class already present
根据@Alan Bateman的评论,我在提取的文件夹中删除了“BoundMethodHandle$Species_***”(源代码中的_L除外),在这个阶段没有问题。但在Eclipse中使用时,它表示需要使用仪器,但存在更多错误:

//try java.intrument gives another error
"C:\Program Files\Java\jdk-9.0.4\bin\jlink.exe" -v --output "C:\Program Files\Java\jdk-9.0.4\lib\modules-repackaged"  --module-path "C:\Program Files\Java\jdk-9.0.4\lib\modules-extracted" --add-modules java.base,java.instrument

//error
Unable to compute the hash of module java.instrument

顺便说一句,如何重新打包JDK,使其包含所有模块。我可以使用类似“-addmodules*”的东西吗?除了base和instrument之外,Java HelloWorld还需要哪些基本模块?

您可以在JDK中使用jmods来打包新的JDK

//first fork JDK9 or you may won't have an fully functional one
Xcopy /y /q /E /I "C:\Program Files\Java\jdk-9.0.4" "C:\Program Files\Java\jdk-9.0.4_repack" 

//this is needed if you do this for the second time
rd /S /Q "C:\Program Files\Java\jdk-9.0.4_repack\jdk-9.0.4_repack"

//generate a meta-JDK from jmods
//it's called meta since the output is like a JDK
//but still missing some file to be used alone
"C:\Program Files\Java\jdk-9.0.4\bin\jlink.exe" -v --output "C:\Program Files\Java\jdk-9.0.4_repack\jdk-9.0.4_repack"  --module-path "C:\Program Files\Java\jdk-9.0.4\jmods" --add-modules java.base,java.instrument

//combine the meta JDK with the forked JDK 
//(close Eclipse first if it is referencing "C:\Program Files\Java\jdk-9.0.4_repack")
Xcopy /y /q /E /I "C:\Program Files\Java\jdk-9.0.4_repack\jdk-9.0.4_repack" "C:\Program Files\Java\jdk-9.0.4_repack"
现在,您可以添加“C:\Program Files\Java\jdk-9.0.4_repack”作为Eclipse的另一个jdk/JRE选项,并在应用程序中使用它。此JDK仅包含您添加的模块

待办事项:

(1) 也许jlink可以生成一个完整的JDK,而不是具有更正确参数的“元版本”


(2) 使用jmod命令提取“C:\Program Files\Java\jdk-9.0.4\jmods”中的一些jmods,然后编辑内容,例如删除一些类,然后重新打包jmods,然后在jlink中使用它们。

不清楚您试图做什么。您使用jimage从运行时映像中提取资源的是什么?其中一些是在链接时生成的,不适合作为jlink的重新输入。@Alan Bateman目的是修改JDK9中的文件“modules”,例如删除某个模块/删除某个模块中的某个类,然后我可以将删除代码的源代码复制和修改到项目中,对其进行一些实验。这是解决这个问题的一个潜在途径。您是否已经看过
java--patch模块
?当您要替换运行时映像中的类时,这对于调试非常有用。jlink工具没有等效的选项。@Alan Bateman在哪里将其放入Eclipse调试会话?