你对类路径的工作方式有点生疏了:)。
一个类路径条目代表一个根:每当要求 JVM 加载任何资源(类是一种资源)时,JVM 将创建一个描述该资源的路径字符串,然后执行通过类路径中的每个条目(因此,每个 root),附加资源字符串,然后检查它是否存在。第一个在那里获胜;已加载,JVM 不再查看。
当您尝试加载类时,例如com.foo.Whatever,则构造的字符串为:"com/foo/Whatever.class"。
因此,如果您的类路径是:
foo.jar:dir/classes
那么如果:
jar -t foo.jar
lists:/com/foo/Whatever.class,jar 文件中的那个项被使用了,JVM 就不用再看了。如果不存在,接下来 JVM 将尝试检查文件 dir/classes/com/foo/Whatever.class 是否存在。如果是,则已加载。
换句话说,你不想要WEB-INF/classes/**/*。你只想要WEB-INF/classes。所有你需要的。
现代 JVM 确实支持 *,但仅适用于 多个 jar 文件:给定一个充满 jar 的目录,每个 jar 都是它自己的根,并且 * 可用于将 em 全部添加。请注意,只是*,而不是*.jar,并且在unix 中您必须转义*,否则bash/您的shell 应用程序将尝试扩展它,这是您不想要的。因此,给定:
C:\Program Files\yourapp\yourapp.jar
C:\Program Files\yourapp\additionalclasses\com\foo\Whatever.class
C:\Program Files\yourapp\lib\guava.jar
C:\Program Files\yourapp\lib\jdbi.jar
例如,您可以放入该应用的清单:
Class-Path: additionalclasses lib/guava.jar lib/jdbi.jar
然后只需使用java -jar yourapp.jar 运行它,它就会运行并找到所有内容。当使用 -cp 选项时,你会这样做:
java -cp yourapp.jar;additionalclasses;lib/* com.foo.yourapp.Main
在 Windows 和所有其他操作系统上,例如:
java -cp 'yourapp.jar:additionalclasses:lib/*' com.foo.yourapp.Main
注意单引号 - 确保 bash 不会尝试解释 *。
对于像 tomcat 这样的预配置内容,通常您无需进行任何配置。 tomcat '知道' WEB-INF/classes 是该模块的类路径根目录,只是......让它工作。