java命令执行带jar包依赖的文件执行不了

import org.apache.commons.io.FilenameUtils;

public class Test {

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

如上所示,简单代码中依赖了commons-io.jar包

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

执行命令:
java -cp commons-io-2.4.jar Test
报错:
错误: 找不到或无法加载主类 Test

改成指定目录:
java -cp . Test
报错:

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

请问是什么原因导致的?

阅读 2.8k
2 个回答

如果是Windows的话:

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

如果是mac或linux的话:

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

jar文件的主要配置类是manifest.mf文件,其中指定了main start类的位置,这种情况下有可能maven编译缓存导致的,也可能是maven打包工具导致的,你可以尝试在目标编译项目根路径执行:

mvn clean -U install
mvn package

仅仅执行main的jar程序的话,在*unix下可以通过:

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

还有一种方式是修改manifest.mf中的class-path变量的路径参数,大概是:

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

大概就是这么个结构,把需要依赖的工具包添加到路径里再运行:

$ java -jar main-name.jar

Windows可能也类似吧,具体不大清楚

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题