【问题标题】:Issue with the java classpath in shell script - jars not detectableshell 脚本中的 java 类路径问题 - 无法检测到 jar
【发布时间】:2018-10-03 09:13:01
【问题描述】:

我正在尝试使用我在 Ubuntu 中创建的 jar 文件运行我的 java 源代码,但我遇到了我的 jar 文件未被检测到的问题。我已将所有 jar 文件复制到一个子文件夹中,并将我的源代码 jar 放在外面。我正在尝试从我的主 jar 调用 main 函数,并且我能够成功地做到这一点,但不知何故,我的相对子文件夹中的相关 jar 是不可检测的。我尝试了一切,包括创建或测试清单文件,但没有成功。我的代码在 Eclipse IDE 中运行良好。下面是我的shell脚本代码-

LIB=./ChainLib/
echo "$LIB"
echo ls "$LIB"
CLASSPATH=./ChainLib/*.jar
export CLASSPATH=./ChainLib/*.jar
echo Classpath_is "$CLASSPATH"
#$(JARS=("$LIB"/*.jar); IFS=:; 
#echo "${JARS[*]}")
jarnames=`ls ./ChainLib/*.jar`
for eachfile in $jarnames
do
echo $eachfile
done
#java -cp TestBlockchainkaranl.jar Testing
xvfb-run -a java -jar TestBlock.jar

当我运行上面的脚本时,我得到以下:

bash RunBlockchain.sh
./ChainLib/
ls ./ChainLib/
Classpath_is ./ChainLib/*.jar
./ChainLib/bcpkix-jdk14-1.57.jar
./ChainLib/bcprov-jdk15on-1.59.jar
./ChainLib/commons-codec-1.11.jar
./ChainLib/commons-compress-1.5.jar
./ChainLib/fabric-sdk-java-1.2.1.jar
./ChainLib/httpclient-4.1.1.jar
./ChainLib/httpclient-4.5.6.jar
./ChainLib/httpcore-4.4.10.jar
./ChainLib/javax.json-1.1.jar
./ChainLib/netty-common-5.0.0.Alpha2.jar
./ChainLib/org-apache-commons-logging.jar
u1 Username
Y Filestatus
Exception in thread "main" java.lang.NoClassDefFoundError: org/hyperledger/fabric/sdk/User
        at Testing.main(Testing.java:26)
Caused by: java.lang.ClassNotFoundException: org.hyperledger.fabric.sdk.User
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

如何确保不会出现此问题并且我的 jar 被成功检测到?

更新:我正在添加我创建的清单文件并将其压缩到 jar 文件中

这是清单代码:

Manifest-Version: 1.0
Main-Class: Testing
  Class-Path:/home/ubuntu/KaranHyperledger/java/Blockchaintool/ChainLib/*.jar
  Class-Path:/home/ubuntu/KaranHyperledger/java/Blockchaintool/TestBlock.jar

【问题讨论】:

  • 尝试从 Class-Path 条目的开头删除空格。你也不需要列出你正在运行的 jar。
  • 也尝试扩展*。并以逗号分隔的条目列出。

标签: java shell ubuntu java-8


【解决方案1】:

Java 不检查 CLASSPATH 环境变量。你必须明确地传递它。

java -cp TestBlockchainkaranl.jar:$CLASSPATH Testing

【讨论】:

  • 如何使用 xvfb-run -a java -jar TestBlock.jar 来实现?是正确的说法 xvfb-run -a java -jar TestBlock.jar :$CLASSPATH 测试?
  • @Kdevel 你不能在命令行中指定自定义类路径,以防你使用-jar 参数。它应该在清单中。
  • 我用语法 Manifest-Version: 1.0 Main-Class: Testing Class-Path:/home/ubuntu/KaranHyperledger/java/Blockchaintool/ChainLib/*.jar Class-Path:/ 创建了一个清单文件home/ubuntu/KaranHyperledger/java/Blockchaintool/TestBlock.jar 但它没有以某种方式检测主清单属性并给出错误主清单属性未找到
  • @Kdevel 您可以编辑您的问题并将您的清单添加到其中吗?
  • 或者更好地创建另一个问题,因为它是完全不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2012-06-10
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多