从JAR运行应用程序时,URI不是分层异常

时间:2015-04-10 14:42:44

标签: java file url jackson

我已将我的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();
        }
    }
}

这是我项目的文件夹结构:

source tree

2 个答案:

答案 0 :(得分:4)

调用getClass().getResource(GAME_FILE);将返回相对于this类的网址。如果从JAR文件执行程序,它将返回指向JAR文件的URL。

java中的文件只能代表直接文件系统文件,而不能代表zip / jar档案文件。

修复它:

  1. 尝试使用getClass().getResourceAsStream()并使用该代替File s或
  2. 将文件解压缩到某个目录中,并以与您现在尝试相同的方式使用File

答案 1 :(得分:0)

当你有两个同名文件时会发生这个问题,我的意思是在你的项目中你有一个文件夹名称和#34;图像&#34;在你的桌面上你有其他文件夹他的名字&#34;图像&#34;自动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();
}