在运行可执行maven jar文件时,Java加载资源失败:无法解析";文件:/…”;

在运行可执行maven jar文件时,Java加载资源失败:无法解析";文件:/…”;,java,eclipse,maven,resources,Java,Eclipse,Maven,Resources,我的问题是,当我使用maven(使用shade插件)构建可执行jar并尝试运行jar时,我收到一个错误: java.io.IOException: Unable to resolve "file:/C:/Users/name/Desktop/nameofjar-SNAPSHOT.jar!/path/to/file.gz 当我在eclipse中运行主程序时,GUI会正确加载资源文件。我打印了文件目录的输出: Loading parser from serialized file /C:/User

我的问题是,当我使用maven(使用shade插件)构建可执行jar并尝试运行jar时,我收到一个错误:

java.io.IOException: Unable to resolve "file:/C:/Users/name/Desktop/nameofjar-SNAPSHOT.jar!/path/to/file.gz
当我在eclipse中运行主程序时,GUI会正确加载资源文件。我打印了文件目录的输出:

Loading parser from serialized file /C:/Users/name/git/guis/target/classes/path/to/file.gz
IOException发生在以下代码行:

URL url = SentenceParser.class.getResource("file.gz");
props.setProperty("file", url.getPath());
file.gz位于src/main/resources/path/to/file.gz中,该类在src/main/java/path/to的java src目录中定义


经过研究,我的问题几乎和这个人的问题一模一样:。它们声明必须具有文件的路径才能放入属性文件。一、 此外,还需要文件的路径,无法将资源作为流检索。我需要该路径,以便将该路径添加到属性文件中,然后由外部库读取。

如果您的应用程序中的其他jar需要读取和操作您的jar文件,那么最好将您的文件放在jar文件的外部。像这样:

file.gz
myjar.jar
myjar2.jar

这样,您就可以使用以下代码获得公共资源文件的绝对路径:

static final String WORKINGDIR = System.getProperty("user.dir");
static final String SEPARATOR = System.getProperty("file.separator");
String path =  WORKINGDIR + SEPARATOR + "file.gz";
URL url = SentenceParser.class.getResource(path);
试试这个,看看是否有效


问题是,当您直接从Eclipse中运行应用程序时,应用程序本身并不在jar中。您只是在运行类文件,未打包。因此,它可以很好地找到资源文件。但是,当您jar应用程序并运行它时,资源文件驻留在jar中,应用程序很难找到它。如果将资源文件放在jar外部,那么使用上面提供的代码可以更容易地找到它们。无论如何,我觉得这对我来说最合适。

如果你阅读了我的完整回复,可能会有重复,我声明。我在寻找另一个答案。