从随机位置获取 .classpath

Get .classpath from random location

我正在尝试将我的 .classpath 文件作为 InputStream or File. If I have a class in the default package, I can simply use getResourceAsStream(".classpath"):

ArrayList<String> attributes = new ArrayList<String>();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
// Access classpath from class in default package
Document doc = dBuilder.parse(Main.class.getResourceAsStream(".classpath"));
doc.getDocumentElement().normalize();

NodeList nList = doc.getElementsByTagName("classpathentry");

for (int temp = 0; temp < nList.getLength(); temp++) {

    Node nNode = nList.item(temp);

    System.out.println(nNode.getAttributes().getNamedItem("path").getNodeValue());
}

但在我不知道它相对于 class 访问它的位置的情况下,我无法使用此方法。我尝试使用环境变量 CLASSPATH,但这给了我一个不存在的文件 (C:\Program Files (x86)\QuickTime\QTSystem\QTJava.zip) 的路径。我也试过 System.getProperty("java.class.path");,但那只给了我当前 jar 的名称。我不是在尝试获取当前的 jar 或其路径,而是在(每个?)IDE 项目和 jar 文件中找到的 .classpath XML 格式的文件。

是否有一种干净的(静态)方式可以在不输入其位置的情况下访问 class 路径,可能是通过静态引用?我觉得可能有使用ClassLoader的方法,但我找不到任何这样的方法。

来自How To Get Classpath in Java

public class JavaCoreExample { public static void main(String[] args) { // Call System property to get the classpath value String classpathStr = System.getProperty("java.class.path"); System.out.print(classpathStr); } }

如果您 运行 使用 sbt run 或其他启动器(如 Maven)的程序,您将只会看到 sbt-launch.jar 或显示的启动器 jar。这是因为那实际上是 SBT 或 Maven 的 class 路径,而不是您的客户端程序的路径。

如果您 运行 来自 IDE 的程序(如 IntelliJ),您将看到整个 class 路径:

/usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/mnt/_/work/experiments/scala/Whosebug/target/scala-2.12/classes:/home/mslinn/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.4.jar:/opt/idea-IU-173.3727.127/lib/idea_rt.jar:/opt/idea-IU-173.3727.127/lib/rt/debugger-agent.jar

如果您 运行 使用指定的 class 路径启动程序,也会发生同样的事情。

I am trying to access the xml file that is found in every jar, not the literal path.

我认为您正在寻找不存在的东西。 (当然,它存在于源项目中。但(通常)不存在于二进制 JAR 文件中。看看 JAR 文件的内部!!)

JAR 文件规范没有提及“.classpath”文件。不可执行的 JAR 文件不需要类路径,可执行的 JAR 文件通过清单属性表示类路径。 (参考JAR File Specification)。

现在 技术上可以 将“.classpath”文件从您的 IDE 项目复制到 JAR 文件中(例如,通过自定义 Maven POM 文件,如果你使用 Maven),但我从未听说过 IDE 默认情况下将文件放入 JAR 中。

但是...如果您的 JAR 文件中有“.classpath”文件(以某种方式),您应该能够在运行时找到它们。一种可能性是使用:

该库的广告功能之一是在资源树中搜索与名称正则表达式匹配的文件。