【问题标题】:Running java program through command-line jdb executes correctly but fails when executed as java command-line通过命令行 jdb 运行 java 程序可以正确执行,但在作为 java 命令行执行时会失败
【发布时间】:2019-08-19 10:25:43
【问题描述】:

我在 java 方面相对缺乏经验,所以希望我能够在这里提供足够的信息,以便对其他人相关和有用。

我正在尝试运行其他人的代码库,该代码库接受两个输入文件,在通过它们运行代码时将一些信息打印到 STDOUT 并退出。

我使用如下命令编译了代码:

java -g -cp .:../../deps/dep1.jar:../../deps/dep2.jar:../../deps/dep3.jar nameofclass/Nameofclass.java nameofclass/File1.java nameofclass/File2.java nameofclass/File3.java

然后我可以使用jdb 执行如下所示:

jdb -classpath ".:../../deps/dep1.jar:../../deps/dep2.jar:../../deps/dep3.jar:" nameofclass.Nameofclass file1.ext file2.ext

然后在jdb中:

run nameofclass.Nameofclass file1.ext file2.ext

当我这样做时,我会在 jdb 中打印出正确运行代码的进程,并以 The application exited 结束:

Set uncaught java.langh.Throwable
Set deferred uncaught java.langh.Throwable
>
VM Started: /path/to/src

<print out of the code running correctly>

The application exited

到目前为止,一切都很好。当我尝试使用 java 而不是 jdb 运行相同的代码时,我得到:

java -cp ".:../../deps/dep1.jar:../../deps/dep2.jar:../../deps/dep3.jar:" nameofclass.Nameofclass file1.ext file2.ext

Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: java/lang/invoke/StringConcatFactory

跟踪指向 main 函数开头的一行代码,使用jdb 运行似乎没有任何问题。

任何想法如何运行我可以使用jdb 成功运行但只需在命令行上使用java 的代码?

【问题讨论】:

  • StringConcatFactory 是从 Java 9 开始的。也许检查 java 版本(java -version)。
  • java 版本是什么?
  • 啊!我懂了。我想我为jdb 安装了openjdk-9 和为java 安装了一个较旧的java。我现在更正了以下内容:askubuntu.com/questions/176121/…

标签: java jdb


【解决方案1】:

事实证明,StringFactory 错误指出我的 Java 安装在我的 Ubuntu 16.04 中出现问题,jdb 运行 Java 9 但java 指向的 /usr/bin/java 版本比这要旧得多。我纠正了这个问题:

https://askubuntu.com/questions/176121/dpkg-error-trying-to-overwrite-file-which-is-also-in

最后运行:

sudo update-alternatives --config java

这样做之后,运行 java 类似于 jdb 工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多