java 类路径意外地找到了一个库

java classpath is finding a library unexpectedly

假设 joda 的任何简单使用,例如

package com.domain.testPackage;
public class MyObject
{
    public static void main(String[] args)
    {
        System.out.println((new org.joda.time.DateTime()).toString());
    }
}

jar 可以通过

从 Eclipse (Neon) 导出

File>Export>Java/Runnable Jar>Next>"Copy required libraries into a sub-folder"

java 的以下两个调用都将 运行。

java -cp testProject.jar:testProject_lib/'*' com.domain.testPackage.MyObject

java -cp testProject.jar com.domain.testPackage.MyObject

好像只有第一个运行是对的。为什么第二次调用 运行?

顺便说一句:注意 java 通配符 * 应该被引用,这样 Linux 就不会扩展通配符。相反,通配符逐字传递给 java 并采用 Java 特定的含义,即 "all the JAR files"。请注意,它也可以在没有引号的情况下工作。我说你应该引用它,而不是你需要引用它。它之所以有效,是因为 Linux glob 不太可能找到一个文件名,除其他细节外,中间有一个冒号 testProject.jar:testProject_lib/* 并且进行零匹配的副作用是 glob 将方便地(还是奇怪?)回显整个标记,java 将看到回显的标记并以 Java-fashion 解释它。

Class-Path: . testProject_lib/joda-time-2.9.2.jar

这是在清单中找到的。这就解释了。