Java Jar 和 Classpath 问题

标签 java macos scripting jar

我有一个我无法理解的奇怪问题...我有一个简单的 HelloWorld jar,它是我在 Eclipse 中构建的,它有 Apache Loggings jar 在它的类路径上。我写了一个脚本来运行 jar:

#!/bin/sh
export CLASSPATH=lib/*:$CLASSPATH
java -jar HelloWorld.jar 

这里的目录结构是一个带有HelloWorld.jar的主目录和一个 lib包含 commons-logging-1.1.1.jar 的子目录.

运行此脚本工作正常。但是,当我放置 HelloWorld.jar进入lib目录(即在一个地方包含所有 JAR),并执行 java -jar lib/HelloWorld.jar ,我得到:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

错误。为什么?!?!?!?!

我问这个是因为我在 OSX 上使用 JarBundler 为 HelloWorld 应用程序创建一个应用程序包,并将修改后的脚本放在 MacOS 中目录,而所有库都放在 Resources/Java 中目录。脚本的修改版本是:

#!/bin/sh
RESOURCE_DIR=$(cd "../Resources"; pwd)
export CLASSPATH=$RESOURCE_DIR/Java/*:$CLASSPATH
java -jar $RESOURCE_DIR/Java/HelloWorld.jar 

我遇到了与上述相同的错误,如果能帮助我理解为什么我不能这样做和/或如何解决它,我将不胜感激?

最佳答案

类路径不适用于通配符。每个 jar 都必须明确指定,或者作为 CLASSPATH 变量的一部分,或者在包含在类路径中的另一个 jar 的 list 中。

此外,IIRC java -jar 会忽略类路径中存在的所有第三方 jar。为什么不这样做呢?

java -cp yourJar:logJars <mainClass>

关于Java Jar 和 Classpath 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757916/

相关文章:

macos - 如何在 MacOS 上自动挂载 NFS 共享

macos - 在 mac osx 上使用 libdrizzle 安装 gearman

cocoa - 在 Mac OS X 中更改声音(或其他)系统偏好设置

linux - 我如何知道 bash 中的进程是否超时?

java - setFill() 和 setStroke() 未正确导入

java - 使用 BufferWriter 从多个类写入同一文件

java - 什么是在 JPEG(EXIF 格式)上编写 GPS 元数据的好 Java 库?

java - 如何反序列化实体,将其置于托管上下文中,但不保留任何更改?

macos - OS X 中的低优先级 I/O

php - 在我的 html 页面上运行一个小的 php 脚本的最快和最简单的方法是什么?