我想从命令行运行java代码,但我不明白为什么我设法从保存代码的文件夹中执行此操作,而不是从另一个文件夹中执行此操作。我在 Windows 上并使用 Cygwin。
文件夹
/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
被毫无问题地调用,并且我得到了预期的输出。
如果我
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
是一个 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
运行你的程序。