当来自 JAR 的 运行 应用程序时,URI 不是分层异常
URI is not hierarchical exception when running application from JAR
我已经将我的 Java 控制台应用程序导出到一个 Jar 文件,但是当我 运行 在 JSON 文件中解析的 jar 和调用代码时,我得到一个 java.lang.IllegalArgumentException
有谁知道为什么当我 运行 程序作为 JAR 时抛出异常?当应用程序来自 Eclipse 运行 时,解析工作正常。
这是我执行 jar 文件并调用解析 JSON 文件的代码时输出的确切错误:
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierar
chical
at java.io.File.<init>(Unknown Source)
at gmit.GameParser.parse(GameParser.java:44)
at gmit.Main.main(Main.java:28)
这是在我的 GameParser 中进行解析的方式 class:
public class GameParser {
private static final String GAME_FILE = "/resources/game.json";
private URL sourceURL = getClass().getResource(GAME_FILE);
private int locationId;
private List<Location> locations;
private List<Item> items;
private List<Character> characters;
public void parse() throws IOException, URISyntaxException {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
// read from file, convert it to Location class
Location loc = new Location();
loc = mapper.readValue(new File(sourceURL.toURI()), Location.class);
Item item = mapper.readValue(new File(sourceURL.toURI()), Item.class);
GameCharacter character = mapper.readValue(new File(sourceURL.toURI()), GameCharacter.class);
// display to console
System.out.println(loc.toString());
System.out.println(item.toString());
System.out.println(character.toString());
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是我项目的文件夹结构:
调用 getClass().getResource(GAME_FILE);
将 return URL 相对于 this
class。如果您从 JAR 文件执行程序,它将 return 一个 URL 指向一个 JAR 文件。
java 中的文件只能表示直接文件系统文件,而不是 zip/jar 存档中的文件。
修复它:
- 尝试使用
getClass().getResourceAsStream()
并使用它代替 File
s 或
- 将文件解压缩到某个目录中,然后按照您现在尝试的方式使用
File
。
当你有两个同名文件时会发生这个问题,我的意思是在你的项目中你有一个名为 "Images" 的文件夹,而在你的桌面上你有另一个名为 "images" 的文件夹自动 JVM选择桌面文件夹,所以如果你想确认尝试打印你的 URI.Use 这个例子来显示你的 URI,然后再创建你的文件
try {
URL location = this.getClass().getResource("/WavFile");
System.out.println(location.toURI());
File file = new File(location.toURI());
if (!file.exists()) {
System.out.println(file.mkdirs());
System.out.println(file.getAbsoluteFile());
}else
{
System.out.println(file.getPath());
}
} catch (Exception e) {
e.printStackTrace();
}
我已经将我的 Java 控制台应用程序导出到一个 Jar 文件,但是当我 运行 在 JSON 文件中解析的 jar 和调用代码时,我得到一个 java.lang.IllegalArgumentException
有谁知道为什么当我 运行 程序作为 JAR 时抛出异常?当应用程序来自 Eclipse 运行 时,解析工作正常。
这是我执行 jar 文件并调用解析 JSON 文件的代码时输出的确切错误:
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierar
chical
at java.io.File.<init>(Unknown Source)
at gmit.GameParser.parse(GameParser.java:44)
at gmit.Main.main(Main.java:28)
这是在我的 GameParser 中进行解析的方式 class:
public class GameParser {
private static final String GAME_FILE = "/resources/game.json";
private URL sourceURL = getClass().getResource(GAME_FILE);
private int locationId;
private List<Location> locations;
private List<Item> items;
private List<Character> characters;
public void parse() throws IOException, URISyntaxException {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
// read from file, convert it to Location class
Location loc = new Location();
loc = mapper.readValue(new File(sourceURL.toURI()), Location.class);
Item item = mapper.readValue(new File(sourceURL.toURI()), Item.class);
GameCharacter character = mapper.readValue(new File(sourceURL.toURI()), GameCharacter.class);
// display to console
System.out.println(loc.toString());
System.out.println(item.toString());
System.out.println(character.toString());
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是我项目的文件夹结构:
调用 getClass().getResource(GAME_FILE);
将 return URL 相对于 this
class。如果您从 JAR 文件执行程序,它将 return 一个 URL 指向一个 JAR 文件。
java 中的文件只能表示直接文件系统文件,而不是 zip/jar 存档中的文件。
修复它:
- 尝试使用
getClass().getResourceAsStream()
并使用它代替File
s 或 - 将文件解压缩到某个目录中,然后按照您现在尝试的方式使用
File
。
当你有两个同名文件时会发生这个问题,我的意思是在你的项目中你有一个名为 "Images" 的文件夹,而在你的桌面上你有另一个名为 "images" 的文件夹自动 JVM选择桌面文件夹,所以如果你想确认尝试打印你的 URI.Use 这个例子来显示你的 URI,然后再创建你的文件
try {
URL location = this.getClass().getResource("/WavFile");
System.out.println(location.toURI());
File file = new File(location.toURI());
if (!file.exists()) {
System.out.println(file.mkdirs());
System.out.println(file.getAbsoluteFile());
}else
{
System.out.println(file.getPath());
}
} catch (Exception e) {
e.printStackTrace();
}