【问题标题】:Cannot run java application from command line while providing multiple directories as classpath ( with path separator) on linux在 Linux 上提供多个目录作为类路径(带路径分隔符)时无法从命令行运行 java 应用程序
【发布时间】:2013-10-21 09:58:44
【问题描述】:

我只是将我的 java 项目导出到可执行 jar。我以某种方式使我的项目能够访问来自 DB (hibernate.cfg.xml)、config.properties 和 log4j.properties 的值,并且可编辑以备将来使用...

我想将 hibernate.cf.xml、config.properties 和 log4j.properties 放在 jar 的外部,并将它们放在其他目录的某个位置。

我一直在寻找这个并得到了这种方式:

  1. 在我的部署系统的某个位置创建了一个 /path/to/mydir 目录。
  2. 将 log4j.properties 和 META-INF 以及 hibernate.properties 和 hibernate.cfg.xml 移至 mydir。
  3. 并使用此命令

    这只是示例: java -cp Myjar.jar:/path/to/mydir MyMainClass

    我写的命令是这样的: java -cp coreservice.jar:/mon/properties CoreServiceController.java

我尝试过这样的方法,但我得到了这个错误

Error: Could not find or load main class

任何人都可以帮助我解决它或提供更好的方法会很高兴〜

====================(编辑)======================== =============================

天哪~ 我从我的 jar 中删除(剪切)文件夹 META-INF 并粘贴到我的配置文件夹(/mon/properties)

然后再次尝试这个命令java -cp coreservice.jar;mon/properties/ id.co.bn i.coreservice.controller.CoreServiceController..... annnnddddd这个工作;))

感谢 Apostolos、Antoniossss、Yasa 和无名 :)

【问题讨论】:

  • 你在哪里执行了这个命令?您在当前的工作文件夹中吗?试试这个
  • @Yasa 老实说,我想把那个文件放在我的罐子外面......这样我以后可以编辑并更改设置......
  • 愚蠢的问题,但是你的 MyMainClass 有一个静态的 void main 方法吗?
  • 然后使用 MyMainClass.java 扩展尝试该命令
  • @Apostolos 谢谢 :),yapp MyMainClass 有一个静态的 void main 方法

标签: java eclipse hibernate


【解决方案1】:

你不应该使用

java -cp coreservice.jar:/mon/properties CoreServiceController.java

你应该把类文件放在那里再试一次,而不是源java文件

如果它在包中,比如说 com.test,那么在 com/test 的父目录中键入

java -cp coreservice.jar:. com.test.CoreServiceController

这应该可以工作

(编辑)从特定位置加载 hibernate.cfg.xml 文件,在您的 HibernateUtil 类中尝试此方法:

public static void setConnectionProperties() {
    URL configFileURL = null;

    try {
        configFileURL = URL_OF_YOUR_CFG_XML_FILE;
        configuration = (new Configuration()).configure(configFileURL);
        sessionFactory = configuration.buildSessionFactory();

    } catch (HibernateException e) {
        e.printStackTrace(); 
        System.out.println("Error while initializing hibernate: " + e.getMessage());
    }

}

【讨论】:

  • 所以你在目录 dir1 可以说在这个 dir1 目录中你有子目录 com/test 并且在这个 com/test 子目录 (dir1/com/test) 中你有一个带有包声明的 CoreServiceController.class的包 com.test 并且您运行此命令并输出相同的错误?你确定你在做不同的事情吗?
  • 是的,我敢肯定...当我写这个命令java -cp coreservice.jar:/mon/properties id.co.bni.coreservice.controller.CoreServiceController我得到这个错误could not find or load main class但是当我用;改变:时我得到了休眠的错误。 cfg.xml (etc) 未找到
  • 注意:我把我所有的配置文件(hibernate.cfg.xml、log4j.properties 和 config.properties)都放到了/mon/properties... 所以我的目的是我的命令可以让 hibernate 去看看配置文件夹...
  • @splatter_fadli 好的,所以您不在 linux 环境中。记住。 linux 中的类路径用 : 区分,但在 windows 用 ;
  • 是的,我现在才记得...那么我的命令如何指示休眠查看此文件夹/mon/properties 进行配置...任何想法?
【解决方案2】:

如果我正确理解了您的问题:

配置sessionFactory的时候可以这样写

new Configuration()
            .configure("/path/to/your/files/hibernate.cfg.xml")
            .buildSessionFactory();

full example

【讨论】:

  • Hibernate 在类路径上检查 hibernate.cfg.xml,所以硬编码路径(外部或非外部)不是一个好主意。提供适当的类路径就足够了。
  • 在这种特殊情况下它不会起作用,因为问题创建者不知道如何执行应用程序,并且在他吃午饭时将其保留在正确的类路径中,无论如何它都可以解决问题。问题对这种特殊情况具有误导性,因为问题不在休眠配置等中。
  • @user2740224 就像 Antoniosss 说的,这不是我的意思.....我试过这个方法,这只是从其他目录读取配置但仍然必须在项目文件夹中......
【解决方案3】:

所以你仍然有同样的问题,我必须说你在做一些非常非常错误的事情,因为这是 Java 运行时的基础。原则:

  1. 您必须提供完全限定的类名才能运行 java,而不是源文件 (*.java),因此您的调用必须是 proper.package.CoreServiceController
  2. CoreServiceController 不能 在默认页面中(未指定包名称) - 如果是,则创建一些包仅用于测试,例如。 service.core 并把CoreServiceController 放在那里。至于第 1 点 - 您的电话将是 java -cp coreservice.jar:/mon/properties service.core.CoreServiceController 仅此而已,仅此而已。
  3. 如果您为类路径提供了错误的条目,Java 会出现令人讨厌的行为 - 它并没有这样说,例如。文件 myUberProgram.jar 不存在等。它将忽略此类条目并继续。我在带有 CP 的 Linux 上遇到了类似的问题 - 拼写错误的 jar 文件和“这到底是怎么回事?!为什么它没有运行” - 和你一样的问题 - no class found
  4. 检查以 101% 确定,如果您的 jar 文件中有 CoreServiceController.class 文件 - 可能是包装有问题,并且 jar 中没有这样的文件。
  5. 最后,如果所有之前的限制都已满足并且没有任何效果,那么您最后的机会是导航到将工作目录更改为 jar 文件所在的目录(只需从命令行转到该目录)并尝试在没有外部 cp 的情况下运行应用程序假如。从 jar 所在的目录:
    1. 致电 java -cp Myjar.jar proper.package.CoreServiceController - 应该可以,但下一个已 100% 检查
    2. 请致电 java -cp ./Myjar.jar proper.package.CoreServiceController - 我在远程 Linux 服务器上的所有应用程序都是从 bash 脚本启动的,就像这样,它始终有效。

如果这些都没有帮助你,那么我必须说把你的 mashine 扔进海里,因为它被诅咒了或者什么 xD - 我只想说,我没有其他想法可以帮助你。

为了您的练习,构建简单的 HelloWorld jar 并尝试从命令行启动它(但不是可运行的 jar,因此您必须提供类路径)。也许这样你会发现你做错了什么。 今天的思路就到此为止了,先生好!

附言。 @splatter_fadli 我允许自己编辑你的问题,因为现在它是错误的——你对 H 配置没有问题,只有在运行应用程序时提供了类路径中的多个条目。也许它会被接受。 - 啊啊啊,完成了。

最后的修改: 根据this 问题 - QA 将类路径条目放入逗号。试试看。如果Class not found 会消失,那么我们已经完成了一半。 -cp "coreservice.jar:/mon/properties"

【讨论】:

  • 我向你保证,如果我不能解决我的问题,我会把我的电脑扔到海底;))...我把我的配置文件放到文件夹/mon/properties.. . 显然,我在声明包时没有错,因为当我尝试这个java -cp coreservice.jar;/mon/properties id.co.bni.coreservice.controller.CoreServiceControllerjava -cp coreservice.jar id.co.bni.coreservice.controller.CoreServiceController 时,错误告诉我hibernate 找不到文件配置,但是当我将; 更改为: 时,我得到了class not found ...我认为我的命令仍然没有直接指向我的配置文件 ~
  • 我试过这个java -cp coreservice.jar /mon/properties id.co.bni.coreservice.controller.CoreServiceController 我得到Class not found .mon.properties 错误...
  • 我试过这个命令java -cp "coreservice.jar:/mon/properties" id.co.bni.coreservice.controller.CoreServiceControllerannnndddd 我得到“找不到类”错误:(
  • 注意:我在阅读this后得到了这个方法
  • 尽管我很想,但我不知道如何帮助你。它应该工作。问题显然在于提供多个类路径。
猜你喜欢
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2015-08-31
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多