java - 相当于 Jar 中的 this.getClass().getClassLoader().getResource (".").toURI()

标签 java maven jar resources classloader

我正在尝试实现一种在从 jar 中运行时获取当前类加载器的基本路径的方法。

我的意思是,以编程方式,我已经知道它应该具有“jarPath+jarFile.jar!/”的形状

与文件系统的调用不同,getResource(".") 或 .getResource("/") 不能在 jar 内部工作。

理想情况下,它应该是任何文件提供程序的抽象解决方案,例如:

Path BASE_PATH = Paths.get(...getResource("").toURI())

它可以返回 jar 和文件系统的正确根路径,这样我就可以使用资源的相对 url,而无需执行任何条件语句和 url 手动字符串解析/构建。

最佳答案

您应该能够使用以下代码找到包含您的类或任何资源的 jar 和/或目标文件夹的路径:

package com.stackoverflow.test;

import java.net.URL;
import java.nio.file.Paths;

public class ClassPathUtils {

  public static String getBasePath(String jarPath) {
    String path = getJarPathFromClass(jarPath);
    if (path == null) {
      return null;
    }

    if (path.startsWith("jar:")) {
      path = path.substring("jar:".length());
    }
    if (path.startsWith("file:")) {
      path = path.substring("file:".length());
    }
    if (path.endsWith(jarPath)) {
      path = path.substring(0, path.length()-jarPath.length());
    }

    return path;
  }
  public static String getBasePath(Class clazz) {
    return getBasePath(classNameDotClass(clazz));
  }
  private static String classNameDotClass(Class clazz) {
    return clazz.getName().replaceAll("\\.", "/") + ".class";
  }
  private static String getJarPathFromClass(String resource) {
    final URL url = ClassPathUtils.class.getClassLoader().getResource(resource);
    return url == null ? null : url.toString();
  }
  public static void main(String[] args) {
    //System.out.println(Paths.get(ClassPathUtils.getBasePath("."))); // doesn't work in a jar
    System.out.println(Paths.get(ClassPathUtils.getBasePath(ClassPathUtils.class)));

    System.out.println(Paths.get(ClassPathUtils.getBasePath("fonts/atcitadelscript.ttf"))); // any classpath resource

    System.out.println(Paths.get(ClassPathUtils.getBasePath(String.class))); // actually finds rt.jar

  }
}

如果您从 IDE 或 Maven 运行此代码,它将为您提供您自己的资源的目标/类的路径,或其他资源的 jar 的路径(例如 String.class)。 如果您从 jar 中调用它,它总是会告诉您 jar 文件的路径。

从 IDE 运行:

/home/alexander/projects/stackoverflow/stuff/target/classes
/home/alexander/projects/stackoverflow/stuff/target/classes
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar!`

从 JAR 运行:

/home/alexander/projects/stackoverflow/stuff/target/test-stuff-0.1-SNAPSHOT.jar!
/home/alexander/projects/stackoverflow/stuff/target/test-stuff-0.1-SNAPSHOT.jar!
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar!

这就是你要找的吗?

关于java - 相当于 Jar 中的 this.getClass().getClassLoader().getResource (".").toURI(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487144/

相关文章:

java - 如何从扫描仪读取字符串,并将每个字母转换为不同的值?

java - Kotlin 的多平台依赖问题

运行时下载的 jar 文件出现 java.lang.NoClassDefFoundError

java - 部署在 Eclipse 中构建的 Java 桌面应用程序

groovy - 如何使用Gradle构建Groovy JAR并将其发布到内部 repo 中

java - 机器人 : how to change the style of edit text?

java - 矩阵中的最短路径

java - 如何使用 Maven Artifact 作为另一个 Artifact (或模块)的输入?

maven - 迁移前的 Flyway Maven init

maven - Jacoco带 jetty + Selenium RC