鍍金池/ 問(wèn)答/Java/ java命令執(zhí)行帶jar包依賴的文件執(zhí)行不了

java命令執(zhí)行帶jar包依賴的文件執(zhí)行不了

import org.apache.commons.io.FilenameUtils;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        System.out.println(FilenameUtils.getExtension("a.zip"));
    }
}

如上所示,簡(jiǎn)單代碼中依賴了commons-io.jar包

編譯命令:
javac -cp commons-io-2.4.jar -d . Test.java
編譯成功!

執(zhí)行命令:
java -cp commons-io-2.4.jar Test
報(bào)錯(cuò):
錯(cuò)誤: 找不到或無(wú)法加載主類 Test

改成指定目錄:
java -cp . Test
報(bào)錯(cuò):

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FilenameUtils
        at Test.main(Test.java:6)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FilenameUtils
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

請(qǐng)問(wèn)是什么原因?qū)е碌模?/p>

回答
編輯回答
忠妾

jar文件的主要配置類是manifest.mf文件,其中指定了main start類的位置,這種情況下有可能maven編譯緩存導(dǎo)致的,也可能是maven打包工具導(dǎo)致的,你可以嘗試在目標(biāo)編譯項(xiàng)目根路徑執(zhí)行:

mvn clean -U install
mvn package

僅僅執(zhí)行main的jar程序的話,在*unix下可以通過(guò):

$ java -cp $path/依賴1.jar;依賴2.jar;main程序.jar MainClass

還有一種方式是修改manifest.mf中的class-path變量的路徑參數(shù),大概是:

...
Main-Class: xxx.xxx.xxx.MainClass
Class-Path:/xxx/hello.jar,/lib/xxx/ahaha.jar

大概就是這么個(gè)結(jié)構(gòu),把需要依賴的工具包添加到路徑里再運(yùn)行:

$ java -jar main-name.jar

Windows可能也類似吧,具體不大清楚

2017年1月11日 01:32
編輯回答
脾氣硬

如果是Windows的話:

java -cp commons-io-2.4.jar;. Test

如果是mac或linux的話:

java -cp commons-io-2.4.jar:. Test
2018年3月29日 03:49