URI не является иерархическим исключением при запуске приложения из JAR

1

Я экспортировал консольное приложение 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();
        }
    }
}

Это структура папок моего проекта:

Изображение 174551

Теги:
file
url
jackson

2 ответа

4
Лучший ответ

Вызов getClass().getResource(GAME_FILE); вернет URL-адрес относительно this класса. Если вы выполняете свою программу из JAR файла, он вернет URL-адрес, указывающий на файл JAR.

Файлы в java могут представлять только файлы прямой файловой системы, а не файлы в архивах zip/jar.

Исправить это:

  1. Попробуйте использовать getClass().getResourceAsStream() и использовать это вместо File или
  2. извлеките файлы в какой-то каталог и используйте File же, как вы сейчас пытаетесь.
  • 0
    Хорошо, так что же делать в этом случае, отбросьте getResource? Можете ли вы показать пример фрагмента кода.
  • 0
    Обновлено с предложением.
Показать ещё 5 комментариев
0

Эта проблема возникает, когда у вас есть два файла с одним и тем же именем, я имею в виду, что в вашем проекте у вас есть папка с именем "Изображения", а на вашем рабочем столе у вас есть другая папка. Его имя "изображения" автоматически. 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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню