我正在开发一个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文件中使用它们?
亲切的问候 马克
答案 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();
}
}