【问题标题】:Not able to compile and run a classpath Java Application无法编译和运行类路径 Java 应用程序
【发布时间】: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.datacom.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


【解决方案1】:

如果无法亲自尝试,则很难诊断问题。但是您确定 JAR 包含您认为它们包含的内容并且在正确的文件夹中吗? 您手动编写的编译和打包脚本可能是错误的来源。使用 Java 手动执行此类操作需要很多事情才能完全正确。这就是为什么通常使用 ant、maven 等构建工具的原因,也是人们使用 IDE 的原因。您选择一个工具,对源代码进行布局以匹配工具偏好,然后利用该工具的能力来抽象出编译和打包的所有复杂性。

我建议您不妨看看 Maven 作为一个很好的起点,然后重新设计您的文件夹结构以更好地适应它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多