Я экспортировал консольное приложение Java в файл Jar, но когда я запускаю jar и код вызова, который анализирует файл JSON, я получаю 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:
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);
вернет URL-адрес относительно this
класса. Если вы выполняете свою программу из JAR файла, он вернет URL-адрес, указывающий на файл JAR.
Файлы в java могут представлять только файлы прямой файловой системы, а не файлы в архивах zip/jar.
Исправить это:
getClass().getResourceAsStream()
и использовать это вместо File
илиFile
же, как вы сейчас пытаетесь.Эта проблема возникает, когда у вас есть два файла с одним и тем же именем, я имею в виду, что в вашем проекте у вас есть папка с именем "Изображения", а на вашем рабочем столе у вас есть другая папка. Его имя "изображения" автоматически. JVM выбирает папку рабочего стола, поэтому, если вы хотите подтвердите попытку распечатать свой URI. Используйте этот пример, чтобы показать свой 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();
}