测试 java 对象是否从 jar 文件执行?

Test if a java object is executing from a jar file?

我想 运行 测试将部署在 .jar 文件中的 Java 项目。但我不想在调试时经历构建完整 jar 文件的麻烦。

问题是我想读取存在于 jar 中但在构建之前位于其他地方的文件。我想测试 运行 中的程序是否包含在 jar 文件中,如果没有,告诉它在别处寻找必要的文件,如下所示:

java.io.File dataFolder;

if (isRunningFromJar())
   dataFolder = ...
else
   dataFolder = ...

这可以做到吗?

我在调试非 jar 变体时直接 运行 宁 class 文件:

java -cp 'src/' com.path.Run

要回答您的问题,您可以使用 Class.getResource().getProtocal()。下面是一个工作示例:

import java.util.Objects;

public class Test {
    public static void main(String[] args){
        String protocol = Test.class.getResource("Test.class").getProtocol();
        if(Objects.equals(protocol, "jar")){
            System.out.println("running in jar");
        } else if(Objects.equals(protocol, "file")) {
            System.out.println("running in file");
        }
    }
}

或者,这里有一个解决方法可以更简单地实现相同的目标。

你可以在dev环境中传入一个JVM参数,比如java -Dfolder=

在代码中,

if(StringUtils.isNotBlank(System.getParameter("folder")) //dev env
     dataFolder = System.getParameter("folder")
else
     dataFolder = <relative path in jar>

根据程序的严重程度,您可能希望在发布前删除 System.getParameter 代码。