【发布时间】:2021-07-16 17:27:30
【问题描述】:
在部署 Java 时,我在理解如何管理文件夹和包名称时遇到了严重的问题。我有这个小程序,结构如下:
deployer-classpath.bat
deployer-modulepath.bat
src
data
com
myname
appname
data
*.java
resources.properties
resources_en_GB.properties
main
com
myname
appname
main
App.java (main)
所以,我的意图是有两个包:com.myname.appname.data 和 com.myname.appname.main,如果我错了,请纠正我,我选择这种布局是为了能够创建两个模块来以模块化方式设置应用程序。
我使用 deployer-classpath.bat 编译(旧式编译):
call "javac.exe" -d ".\output\classes" ".\src\data\com\micesp\PMapp\data\*.java"
call "jar.exe" --create --file ".\output\libs\data.jar" -C ".\output\classes" .
rmdir /q/s ".\output\classes"
mkdir ".\output\classes"
call "javac.exe" -d ".\output\classes" -classpath ".\output\libs\data.jar" ".\src\main\com\micesp\PMapp\main\*.java"
call "jar.exe" -c -f ".\output\libs\main.jar" -C ".\output\classes" .
rmdir /q/s ".\output\classes"
call "java.exe" -classpath "%cd%\output\libs\data.jar";"%cd%\output\libs\main.jar" "com.micesp.PMapp.main.App"
<!-- language: lang-none -->
嗯,这是输出:
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.micesp.PMapp.main.App.main(App.java:25)
Caused by: java.util.MissingResourceException: Can''t find bundle for base name com.micesp.PMapp.data.resources, locale en_GB
at java.base/java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:2055)
at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1689)
at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1593)
at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1556)
at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:932)
at com.micesp.PMapp.data.ProductManager$ResourceFormatter.<init>(ProductManager.java:219)
at com.micesp.PMapp.data.ProductManager.<clinit>(ProductManager.java:36)
... 1 more
如果我将它作为模块化应用程序运行,使用 deployer_modulepath.bat,结果相同:
call "javac.exe" -d ".\output\classes" ".\src\data\com\micesp\PMapp\data\*.java"
call "jar.exe" --create --file ".\output\libs\data.jar" -C ".\output\classes" .
rmdir /q/s ".\output\classes"
mkdir ".\output\classes"
call "javac.exe" -d ".\output\classes" -classpath ".\output\libs\data.jar" ".\src\main\com\micesp\PMapp\main\*.java"
call "jar.exe" -c -f ".\output\libs\main.jar" -C ".\output\classes" .
rmdir /q/s ".\output\classes"
call "java.exe" --module-path ".\output\libs" -m "main/com.micesp.PMapp.main.App"
【问题讨论】:
-
call是做什么的?我们可以只获取命令行输入而不需要批处理文件吗? -
call专门用于调用其他批处理文件。对于一个普通的 exe,做call program arguments而不是program arguments是没有意义的。 -
要运行一个模块,你必须指定
-m "main/com.micesp.PMapp.main.App",即用斜杠将模块名与主类名分开,而不是反斜杠。当然,这不会改变这样一个事实,即当您不将资源添加到 jar 中时,您会得到一个MissingResourceException。与某些 IDE 不同,javac不会将资源文件复制到目标目录。 -
Everything 在运行时需要在 .jar 文件中。您只添加了
.class文件,但没有添加.properties文件。 -
您可以在创建 jar 文件之前将属性文件复制到 classes 目录,或者先创建包含类的 jar 文件,然后更新 jar 文件(使用
u而不是 @987654335 @),直接从源目录添加属性文件。我想,你想要一个命令来自动查找和处理所有资源文件,而不是手动指定每个资源,但这是一个特定的 Windows 批处理文件问题,我无法回答。
标签: java deployment jvm classpath module-path