从随机位置

时间:2017-12-28 04:43:45

标签: java reference classpath static-methods

我正在尝试将.classpath文件作为InputStreamFile。如果我在默认包中有一个类,我可以简单地使用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());
}

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

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

2 个答案:

答案 0 :(得分:1)

  

我正在尝试访问每个jar中找到的xml文件,而不是文字路径。

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

JAR文件规范没有提及&#34; .classpath&#34;文件。不可执行的JAR文件不需要类路径,可执行的JAR文件通过manifest属性表示类路径。 (参考JAR File Specification)。

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

但是......如果有&#34; .classpath&#34;您的JAR文件中的文件(不知何故),您应该能够在运行时找到它们。一种可能性是使用:

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

答案 1 :(得分:0)

来自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的类路径,而不是您的客户端程序。

如果从IDE(如IntelliJ)运行程序,您将看到整个类路径:

/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/stackOverflow/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

如果通过使用指定的类路径启动程序来运行程序,则会发生同样的事情。