等同于 Jar 中的 this.getClass().getClassLoader().getResource(".").toURI()
Equivalent of this.getClass().getClassLoader().getResource(".").toURI() from within a Jar
我正在尝试实现一种在从 jar 中运行时获取当前类加载器的基本路径的方法。
我的意思是以编程方式,我已经知道它应该具有 "jarPath+jarFile.jar!/"
的形状
与文件系统的调用不同,getResource(".") 或 .getResource("/") 在 jar 内部不起作用。
理想情况下,它应该是任何文件提供者的抽象解决方案,例如:
Path BASE_PATH = Paths.get(...getResource("").toURI())
这可能 return jar 和文件系统的正确根路径,因此我可以使用相对 url 到我的资源,而无需执行任何条件语句和 url 手册字符串 parsing/build。
您应该能够使用以下代码找到包含您 class 或任何资源的 jar 和/或目标文件夹的路径:
package com.Whosebug.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 的代码,它将为您 自己的资源[=25] 提供通往 target/classes 的路径=],或 其他资源 的 jar 路径(例如 String.class)。
如果你从 jar 调用它,它总是会告诉你 jar 文件的路径。
运行 来自 IDE:
/home/alexander/projects/Whosebug/stuff/target/classes
/home/alexander/projects/Whosebug/stuff/target/classes
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar!`
运行 来自 JAR:
/home/alexander/projects/Whosebug/stuff/target/test-stuff-0.1-SNAPSHOT.jar!
/home/alexander/projects/Whosebug/stuff/target/test-stuff-0.1-SNAPSHOT.jar!
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar!
这就是你要找的吗?
我正在尝试实现一种在从 jar 中运行时获取当前类加载器的基本路径的方法。
我的意思是以编程方式,我已经知道它应该具有 "jarPath+jarFile.jar!/"
的形状与文件系统的调用不同,getResource(".") 或 .getResource("/") 在 jar 内部不起作用。
理想情况下,它应该是任何文件提供者的抽象解决方案,例如:
Path BASE_PATH = Paths.get(...getResource("").toURI())
这可能 return jar 和文件系统的正确根路径,因此我可以使用相对 url 到我的资源,而无需执行任何条件语句和 url 手册字符串 parsing/build。
您应该能够使用以下代码找到包含您 class 或任何资源的 jar 和/或目标文件夹的路径:
package com.Whosebug.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 的代码,它将为您 自己的资源[=25] 提供通往 target/classes 的路径=],或 其他资源 的 jar 路径(例如 String.class)。 如果你从 jar 调用它,它总是会告诉你 jar 文件的路径。
运行 来自 IDE:
/home/alexander/projects/Whosebug/stuff/target/classes
/home/alexander/projects/Whosebug/stuff/target/classes
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar!`
运行 来自 JAR:
/home/alexander/projects/Whosebug/stuff/target/test-stuff-0.1-SNAPSHOT.jar!
/home/alexander/projects/Whosebug/stuff/target/test-stuff-0.1-SNAPSHOT.jar!
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar!
这就是你要找的吗?