【问题标题】:Using wildcards in java classpath [duplicate]在java类路径中使用通配符[重复]
【发布时间】:2012-06-06 13:14:03
【问题描述】:

我正在运行一个应该执行 main 方法的 shell 脚本:

java -classpath /path/to/app/conf/lib/nameJar* com.example.ClassTest

在这一点上,我得到了这个异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)

这是因为弹簧罐位于另一个文件夹中。所以我改变了脚本:

java -classpath /path/to/app/conf/lib/nameJar*:/path/to/app/lib/spring* com.example.ClassTest

但使用此脚本,无法找到 com.example.ClassTest。关于这个问题有什么想法吗?

提前致谢

【问题讨论】:

    标签: java classpath wildcard


    【解决方案1】:

    java 类路径通配符扩展异常。

    来自docs

    了解类路径通配符

    类路径条目可以包含基本名称通配符 *,它被认为等同于 使用扩展名指定目录中所有文件的列表 .jar 或 .JAR。例如,类路径条目 foo/* 指定所有 名为 foo 的目录中的 JAR 文件。一个类路径条目,包括 简单的 * 扩展为当前所有 jar 文件的列表 目录。

    所以,你需要指定的是:

    java -classpath /path/to/app/conf/lib/*:/path/to/app/lib/*
    

    如果您只需要特定的 jar,则需要单独添加它们。类路径字符串接受通用通配符,如 nameJar**.jarspring* 等。

    阅读Setting multiple jars in java classpath了解更多信息。

    【讨论】:

      【解决方案2】:

      似乎 JVM 找不到 Spring 相关的 JARS。 将所有必需的 JARS 放在一个位置(例如 c:\libs)并在运行“java”命令时使用“java.ext.dirs”

      喜欢:

      java -Djava.ext.dirs=c:/libs com.example.ClassTest
      

      【讨论】:

      • 对于属于类路径的普通 jar,我不会使用 java.ext.dirs
      猜你喜欢
      • 2015-05-14
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2014-10-30
      • 2012-04-07
      • 1970-01-01
      相关资源
      最近更新 更多