我有以下项目 struct .
ProjectName
|
|---src
|
|---main
|
|---java
| |
| |---ModuleName
| |
| |---module-info.java
| |
| |---PackageName
| |
| |---Main.java
|
|---resources
|
|---ResourceParentFolder
|
|---ResourceSubFolderA
| |
| |---Resource1A.png
| |---Resource2A.png
| |---Resource3A.png
|
|---ResourceSubFolderB
|
|---Resource1B.png
|---Resource2B.png
|---Resource3B.png
这是我的Main.java
美元.
package PackageName;
public class Main
{
public static void main(String[] args) throws Exception
{
new Main();
}
public Main() throws Exception
{
System.out.println("0 - " + ModuleLayer.boot().findModule("ModuleName") .map(o -> o.getClassLoader().getResource("PackageName/Main.class")));
System.out.println("1 - " + ModuleLayer.boot().findModule("ModuleName") .map(o -> o.getClassLoader().getResource("ResourceParentFolder")));
System.out.println("2 - " + ModuleLayer.boot().findModule("ModuleName") .map(o -> o.getClassLoader().getResource("ResourceParentFolder/ResourceSubFolderA")));
System.out.println("3 - " + ModuleLayer.boot().findModule("ModuleName") .map(o -> o.getClassLoader().getResource("/ResourceParentFolder")));
System.out.println("4 - " + ModuleLayer.boot().findModule("ModuleName") .map(o -> o.getClassLoader().getResource("/ResourceParentFolder/ResourceSubFolderA")));
System.out.println("4b - " + ModuleLayer.boot().findModule("ModuleName") .map(o -> o.getPackages()));
System.out.println("5 - " + ModuleLayer.boot().modules());
System.out.println("6 - " + ModuleLayer.boot().parents());
System.out.println("7 - " + ModuleLayer.boot().toString());
System.out.println("8 - " + Main.class.getClassLoader().getResource("ResourceParentFolder"));
System.out.println("9 - " + Main.class.getClassLoader().getResource("/ResourceParentFolder"));
System.out.println("10 - " + Main.class.getClassLoader().getResource("ResourceParentFolder/ResourceSubFolderA"));
System.out.println("11 - " + Main.class.getClassLoader().getResource("/ResourceParentFolder/ResourceSubFolderA"));
System.out.println("12 - " + Main.class.getClassLoader().getSystemClassLoader().getResource("ResourceParentFolder"));
System.out.println("13 - " + Main.class.getClassLoader().getSystemClassLoader().getResource("/ResourceParentFolder"));
System.out.println("14 - " + Main.class.getClassLoader().getSystemClassLoader().getResource("ResourceParentFolder/ResourceSubFolderA"));
System.out.println("15 - " + Main.class.getClassLoader().getSystemClassLoader().getResource("/ResourceParentFolder/ResourceSubFolderA"));
}
}
module ModuleName
{
requires java.base;
}
下面是我的shell 脚本,它执行编译,执行它,创建一个模块化JAR,执行该JAR,然后调用jpackage
.
echo "STARTING TO COMPILE MODULAR SOURCE CODE"
javac \
--module-source-path=src/main/java \
--module=ModuleName \
-d classes
echo "STARTING TO RUN MODULAR SOURCE CODE"
java \
--module-path="classes" \
--module=ModuleName/PackageName.Main
echo "STARTING TO BUILD A MODULAR JAR"
jar \
--verbose \
--create \
--file run/executable/jar/ProjectName.jar \
--main-class PackageName.Main \
-C classes/ModuleName .
echo "STARTING TO RUN A MODULAR JAR"
java \
--module-path="run/executable/jar" \
--module=ModuleName/PackageName.Main
echo "STARTING TO RUN JPACKAGE"
jpackage \
--verbose \
--type msi \
--name ProjectName \
--input src/main/resources \
--install-dir davidalayachew_applications/ProjectName \
--vendor "David Alayachew" \
--win-dir-chooser \
--module-path run/executable/jar \
--module ModuleName/PackageName.Main \
--win-console \
--java-options "--enable-preview" \
--dest run/executable/installer
如您所见,它创建了一些目录.
现在,执行过程中的输出是我感到沮丧的地方.
以下是编译后立即运行时的输出.
STARTING TO RUN MODULAR SOURCE CODE
0 - Optional[file:**ignore**/ProjectName/classes/ModuleName/PackageName/Main.class]
1 - Optional[file:**ignore**/ProjectName/src/main/resources/ResourceParentFolder]
2 - Optional[file:**ignore**/ProjectName/src/main/resources/ResourceParentFolder/ResourceSubFolderA]
3 - Optional.empty
4 - Optional.empty
4b - Optional[[PackageName]]
5 - [**ignore**]
6 - []
7 - **ignore**
8 - file:**ignore**/ProjectName/src/main/resources/ResourceParentFolder
9 - null
10 - file:**ignore**/ProjectName/src/main/resources/ResourceParentFolder/ResourceSubFolderA
11 - null
12 - file:**ignore**/ProjectName/src/main/resources/ResourceParentFolder
13 - null
14 - file:**ignore**/ProjectName/src/main/resources/ResourceParentFolder/ResourceSubFolderA
15 - null
好的,它找到了文件夹.因为它是java.net.URLConnection
,所以我可以通过修改URL
来遍历目录.因此,在编译之后立即运行代码就可以了.
以下是运行创建的JAR文件时的输出.
STARTING TO RUN A MODULAR JAR
0 - Optional[jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/PackageName/Main.class]
1 - Optional[jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/ResourceParentFolder/]
2 - Optional[jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/ResourceParentFolder/ResourceSubFolderA/]
3 - Optional.empty
4 - Optional.empty
4b - Optional[[ResourceParentFolder.ResourceSubFolderB, ResourceParentFolder.ResourceSubFolderA, ResourceParentFolder, PackageName]]
5 - [**ignore**]
6 - []
7 - **ignore**
8 - jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/ResourceParentFolder/
9 - null
10 - jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/ResourceParentFolder/ResourceSubFolderA/
11 - null
12 - jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/ResourceParentFolder/
13 - null
14 - jar:file:///**ignore**/ProjectName/run/executable/jar/ProjectName.jar!/ResourceParentFolder/ResourceSubFolderA/
15 - null
好的,连接类型不同,但我们还是找到了相同的文件夹.我可能不得不做一些不同的URL
建设,但前进的道路相当清晰.
现在,以下是我运行新安装的jpackage
版应用程序后发生的事情.
0 - Optional[jrt:/ModuleName/PackageName/Main.class]
1 - Optional.empty
2 - Optional.empty
3 - Optional.empty
4 - Optional.empty
4b - Optional[[ResourceParentFolder, PackageName, ResourceParentFolder.ResourceSubFolderA, ResourceParentFolder.ResourceSubFolderB]]
5 - [module ModuleName, module java.base]
6 - []
7 - ModuleName, java.base
8 - null
9 - null
10 - null
11 - null
12 - null
13 - null
14 - null
15 - null
除了我作为健康判断放置的.class
文件之外,什么也找不到.
所以,我打开了安装目录,我看到我的资源肯定在那里.整个目录、子目录和文件.我的树 struct 中的所有内容(包括ResourceParentFolder
%)都已复制到C:/Program File/davidalayachew_applications/ProjectName/app文件夹中.
我try 了一系列配置,比如在APP中预先设置getResource
个参数,但都没有效果.我已经循环了getResource
个排列,老实说,我已经忘记了大部分.
有人能给我指点一下如何在调用jPackage后让我的应用程序访问我的资源吗?我特别需要能够看到文件夹的内容.而不仅仅是获取单个文件.