尝试访问jar文件中的Resources时出现异常

时间:2014-12-12 07:29:02

标签: java eclipse jar gradle resources

我正在开发一个java应用程序,我正在使用gradle作为我的默认构建系统。 我只有一个问题: 我在java代码中读到了这样的配置文件:

URL url = Main.class.getResource("/configuration/Config.xml");
File file = new File(url.getFile());

这是我的项目结构:

|-- src
|    |-- main
|         |-- java
|         |    \-- ch.example.bla
|         |         |-- Main.java
|         |-- resources
|              \-- Config.xml
\-- build.gradle

这是我的Gradle构建文件:

apply plugin: 'java'
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile 'junit:junit:4.11'
}
sourceCompatibility=System.properties['java.specification.version']
version = '1.0'
compileJava {
    options.compilerArgs.add '-XDignore.symbol.file'
    options.fork = true
    options.forkOptions.executable = "javac" // assumes that javac is on PATH
    options.compilerArgs << "-XDignore.symbol.file"
}
jar {
    manifest {
        attributes    'Implementation-Title': 'ResourceTest',
                      'Implementation-Version': version,
                      'Main-Class': 'ch.example.bla.Main'
    }
}

当我通过eclipse运行程序时,它的运行没有问题。但是当我使用命令“gradle build”生成jar文件时,我得到一个异常。这是我的错误消息,当我尝试通过控制台执行jar文件时(使用命令:“java -jar ResourceTest.jar”):

java.io.FileNotFoundException: D:\Tutorial\Spring\eclipse\workspace\ResourceTest\build\libs\file:\D:\Tutorial\Spring\eclipse\workspace\ResourceTest\build\libs\ResourceTest-1.0.jar!\configuration\Config.xml (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
        at ch.example.bla.Main.main(Main.java:38)

我做错了什么?我应该如何访问java中的资源,以便我可以在jar文件中使用它们?

亲切的问候 马克

4 个答案:

答案 0 :(得分:0)

URL url = Main.class.getResource("/configuration/Config.xml");

我在您的结构中看不到配置文件夹。这应该是: -

URL url = Main.class.getResource("Config.xml");

答案 1 :(得分:0)

我认为您指定的网址与您说明的文件结构不匹配。

URL url = Main.class.getResource("/configuration/Config.xml");

这表示从Main类所在的文件夹开始,然后查看名为“configuration”的子文件夹,并在该子文件夹中找到“Config.xml”。

但是要到达实际的文件夹,名为“resources”而不是“configuration”,你需要进行一次艰苦跋涉。 Main()似乎是在“ch.example.bla”的子文件夹中。如果列出了文件夹结构,如果我正确阅读它,你需要更像“../../resources/Config.xml”,但我不确定我是否正确阅读你的图表。

您可以将“main”FOLDER(不是Main()类)中的任何类用作根目录吗?然后,你不需要“......”的东西。

我正在努力记住我读到的命名约定的最佳解释。也许是半年前......你知道,它可能是API的原因 Class.getResource()

嗯。也许不吧。这个解释非常简洁,但当然完全准确。

How to Use Icons有一个名为“使用getResource加载图片”的2 / 5s部分可能更友好。

答案 2 :(得分:0)

很抱歉配置文件夹在那里,我只是忘了把它写在树上......这是实际的树:

|-- src
|    |-- main
|         |-- java
|         |    \-- ch.example.bla
|         |         |-- Main.java
|         |-- resources
|         |   \-- configuration
|         |         |-- Config.xml
\-- build.gradle

答案 3 :(得分:0)

就是这样:

InputStream initialStream = null;
        OutputStream outStream = null;
        try {
            initialStream = this.getClass().getClassLoader()
                    .getResourceAsStream("config/Config.xml");
            byte[] buffer = new byte[initialStream.available()];
            initialStream.read(buffer);

            File file = File.createTempFile("ConfigTemp", ".xml");
            file.deleteOnExit();

            outStream = new FileOutputStream(file);
            outStream.write(buffer);

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
            System.out.println("Root element :"
                    + doc.getDocumentElement().getNodeName());
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e1) {
            e1.printStackTrace();
        } finally {
            try {
                initialStream.close();
                outStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
相关问题