Java Myclass.class.getProtectionDomain().getCodeSource()返回空路径

Java Myclass.class.getProtectionDomain().getCodeSource()返回空路径,java,eclipse,path,jvm,executable-jar,Java,Eclipse,Path,Jvm,Executable Jar,我正在尝试使用以下方法查找正在运行的jar文件的位置: File jarFile = new File(JarPath.class.getProtectionDomain().getCodeSource().getLocation().toURI()); 当我在IDE(eclipse)上运行它时,它返回正确的路径。 但是当我将jar作为可执行文件运行时,返回的代码源是 rsrc:./ 关于如何获得正确路径的想法?尝试不同的方法获得位置 String jarFilePath = ClassLo

我正在尝试使用以下方法查找正在运行的jar文件的位置:

File jarFile = new File(JarPath.class.getProtectionDomain().getCodeSource().getLocation().toURI());
当我在IDE(eclipse)上运行它时,它返回正确的路径。 但是当我将jar作为可执行文件运行时,返回的代码源是

rsrc:./

关于如何获得正确路径的想法?

尝试不同的方法获得位置

String jarFilePath = ClassLoader.getSystemClassLoader().getResource(".")
        .toURI()
        .getPath()
        .replaceFirst("/", "");
这将为您提供jar文件的父位置

C:/Users/Roshana Pitigala/Desktop/

您仍然需要添加文件名和扩展名(
jarFileName.jar
)。

我也有同样的问题,到目前为止,我发现在Eclipse中生成jar时使用“将所需库打包到生成的jar”选项时会出现这种情况。NetBeans中没有repo在查找类资源时不使用类加载器。一旦涉及到模块,这可能会中断,因为信息丢失。您可以使用
JarPath.class.getResource(“JarPath.class”)
,它比
JarPath.class.getClassLoader().getResource(JarPath.class.getName().replace('.','/')+“.class”)更简单,并且可以在模块化环境中工作,因为仍然拥有
意味着知道关联的模块。这不起作用。
getPath()
抛出一个
NullPointerException
,而
toURI()
给出的是完全限定的类名,而不是jar的路径@用户7291698请立即尝试。我已经按照霍尔格的建议更新了答案。顺便说一句,它应该返回类的路径,而不是jar。其思想是获取类的路径并删除不必要的部分。只有在使用Eclipse选项“将所需库提取到生成的jar”创建jar时,您的解决方案才有效。但我需要一个解决方案,它可以使用“将所需库打包到生成的JAR”选项@用户7291698现在检查答案。它经过测试,并且工作正常。