获取正在运行的JAR文件的路径将返回“ rsrc:./” - java

我的代码在JAR文件中运行,我需要获取该文件的完整路径。
例如,我的JAR名为example.jar,位于D:\ example \
因此,我需要通过该jar内的一些代码来获取“ D:\ example \ example.jar”。
我尝试了许多方法来获取该路径,但是没有一种方法能正常工作。

其中之一是

getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()

许多人说这对他们有用,但是对我来说它返回“ rsrc:./”。

之后,我进行了搜索,发现我的MANIFEST.MF包含以下内容:

Manifest-Version: 1.0
Rsrc-Class-Path: ./
Class-Path: .
Rsrc-Main-Class: Example
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

我不知道这是什么意思,但是如果我删除该Rsrc内容并用它替换其他内容,则说明该jar已损坏。我认为这就是为什么它不起作用的原因。有人知道这意味着什么吗?

PS:我正在使用BAT文件运行JAR。

参考方案

我也偶然发现了这个问题,并将调查留给了那些将来问自己rsrc是什么意思的人。

我正在使用Eclipse Mars 1,并尝试将我的项目导出为可运行的JAR。在这里,我可以选择库处理方式并在以下两者之间做出决定:

将所需的库提取到生成的JAR中
将所需的库打包到生成的JAR中
将所需的库复制到生成的JAR旁边的子文件夹中

要测试的线是

System.out.println(MyClass.class.getProtectionDomain().getCodeSource().getLocation());

JAR文件的名称为MyJar.jar(将放置在桌面上),Project的名称和文件夹为MyProject。

结果:

file:/C:/Users/admin/Desktop/MyJar.jar
rsrc:./
file:/C:/Users/admin/Desktop/MyJar.jar
file:/C:/Development/workspace/MyProject/target/classes/

我为此写了一个方便的方法:

public class SystemUtils {

    /**
     * Let no one instanciate this class.
     */
    private SystemUtils() {}

    /**
     * If the current JVM was started from within a JAR file. 
     * @return <code>Boolean.TRUE</code> if it is, <code>Boolean.FALSE</code> if it is not, <code>null</code> if unknown.
     */
    public static Boolean executedFromWithinJar() {
        Boolean withinJar = null;
        try {
            String location = SystemUtils.class.getProtectionDomain().getCodeSource().getLocation().toString();
            if (location.startsWith("rsrc:")
                || location.endsWith(".jar") && !new File(location.substring(location.indexOf(':') + 1)).isDirectory())
                withinJar = Boolean.TRUE;
            else
                withinJar = Boolean.FALSE;
        }
        catch (Exception ex) {/* value is still null */}
        return withinJar;
    }

}

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…