从与保存代码的文件夹不同的文件夹调用 java 代码时出现 ClassNotFoundException

问题描述 投票:0回答:1

问题

我想从命令行运行java代码,但我不明白为什么我设法从保存代码的文件夹中执行此操作,而不是从另一个文件夹中执行此操作。我在 Windows 上并使用 Cygwin。

示例 1:什么有效

文件夹

/usr/local/lib/mytoolfolder/
包含两个带有java代码的文件夹:

  • mytool/
    (包含我要运行的课程)
  • utils/
    (包含依赖项)

如果我这样做

$ cd /usr/local/lib/mytoolfolder/
$ java -cp ".;utils/bin;utils/lib/*;mytool/bin;mytool/lib/*" mytool.MyTool

...类

MyTool
被毫无问题地调用,并且我得到了预期的输出。

示例 2:什么不起作用

如果我

cd
到计算机上的随机其他文件夹并尝试再次调用
MyTool
,现在包括类路径中的完整路径,如下所示:

$ java -cp "/usr/local/lib/mytoolfolder/.;/usr/local/lib/mytoolfolder/utils/bin;/usr/local/lib/mytoolfolder/utils/lib/*;/usr/local/lib/mytoolfolder/mytool/bin;/usr/local/lib/mytoolfolder/mytool/lib/*" mytool.MyTool

...我明白了

ClassNotFoundException

Error: Could not find or load main class mytool.MyTool
Caused by: java.lang.ClassNotFoundException: mytool.MyTool

我尝试过的事情

我已检查类路径是否正确,并且已检查权限。

问题

我理解这个错误意味着java找不到该类(显然)。我认为这是因为类路径有问题(示例 1 排除了代码本身有问题)。

我不明白类路径或这种方法有什么问题。我的逻辑哪里有问题?我怎样才能让它发挥作用?

也欢迎进一步调试的其他提示。

编辑

按照下面

g00se
的要求——
find /usr/local/lib/mytoolfolder -name \*.jar -o -name \*.class
的输出看起来像这样(实际输出包含更多相同的内容,因为我上面的示例被最小化了):

/usr/local/lib/mytoolfolder/mytool/bin/mytool/MyTool$Connection.class
/usr/local/lib/mytoolfolder/mytool/bin/mytool/MyTool.class
/usr/local/lib/mytoolfolder/utils/bin/tools/math/StatUtils.class
/usr/local/lib/mytoolfolder/utils/bin/tools/path/PathTools$1.class
/usr/local/lib/mytoolfolder/utils/bin/tools/path/PathTools.class
...
/usr/local/lib/mytoolfolder/utils/bin/tools/text/StringTools.class
/usr/local/lib/mytoolfolder/utils/bin/tools/ToolBox.class
/usr/local/lib/mytoolfolder/utils/bin/tools/ToolBox.class
/usr/local/lib/mytoolfolder/utils/lib/jackson-annotations-2.17.1.jar
/usr/local/lib/mytoolfolder/utils/lib/jackson-core-2.17.1.jar
/usr/local/lib/mytoolfolder/utils/lib/jackson-databind-2.17.1.jar
java command-line-interface classnotfoundexception
1个回答
0
投票

java
是一个 Windows 程序,因此它不理解 Unix 风格的路径。 Cygwin 附带了一个实用程序
cygpath
,它可以使用
-p
开关转换单独的路径,甚至整个 PATH 样式路径。但是,它期望这样的路径由冒号分隔。它将把它变成 Windows 风格的分号分隔路径。

所以你可以使用:

cygpath -pw '/usr/local/lib/mytoolfolder:/usr/local/lib/mytoolfolder/utils/bin:/usr/local/lib/mytoolfolder/utils/lib/*:/usr/local/lib/mytoolfolder/mytool/bin:/usr/local/lib/mytoolfolder/mytool/lib/*'

转换路径,甚至:

java -cp "$(cygpath -pw '/usr/local/lib/mytoolfolder:/usr/local/lib/mytoolfolder/utils/bin:/usr/local/lib/mytoolfolder/utils/lib/*:/usr/local/lib/mytoolfolder/mytool/bin:/usr/local/lib/mytoolfolder/mytool/lib/*')"  mytool.MyTool

运行你的程序。

© www.soinside.com 2019 - 2024. All rights reserved.