Java 访问JAR中的资源
我正在创建一个使用Maven概要文件和JAR构建的Java应用程序 我在这个文件夹中有一些XML文件:project/src/main/resources/XML/*.XML src/main/resources文件夹是构建路径中的一个源文件夹,因此我在jar二进制文件中构建了project.jar/XML/*.XML 我希望能够在JAR执行中找到并列出那些文件“/XML/*.XML”。我的结构适合这个吗Java 访问JAR中的资源,java,jar,embedded-resource,Java,Jar,Embedded Resource,我正在创建一个使用Maven概要文件和JAR构建的Java应用程序 我在这个文件夹中有一些XML文件:project/src/main/resources/XML/*.XML src/main/resources文件夹是构建路径中的一个源文件夹,因此我在jar二进制文件中构建了project.jar/XML/*.XML 我希望能够在JAR执行中找到并列出那些文件“/XML/*.XML”。我的结构适合这个吗 运行Maven概要文件没有问题,只是找不到查找和列出这些文件的好方法。如果您想列出jar文
运行Maven概要文件没有问题,只是找不到查找和列出这些文件的好方法。如果您想列出jar文件的内容,只需运行:
jar tf ./path/to/your/file.jar
或
现在从代码开始(我相信这不是唯一的方法),您必须用jar中的任何类替换Main
:
List<String> myJarXmlFiles = new ArrayList<String>();
try {
// replace Main here
CodeSource src = Main.class.getProtectionDomain().getCodeSource();
if (src != null) {
URL jar = src.getLocation();
ZipInputStream zip = new ZipInputStream(jar.openStream());
ZipEntry entry = null;
while ((entry = zip.getNextEntry()) != null) {
if (entry.getName().contains("XML/")
&& entry.getName().endsWith(".xml")) {
myJarXmlFiles.add(entry.getName());
}
}
} else {
// failed
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
List myJarXmlFiles=new ArrayList();
试一试{
//在这里更换总管
CodeSource src=Main.class.getProtectionDomain().getCodeSource();
如果(src!=null){
URL jar=src.getLocation();
ZipInputStream zip=新的ZipInputStream(jar.openStream());
ZipEntry条目=null;
而((entry=zip.getnextery())!=null){
if(entry.getName()包含(“XML/”)
&&entry.getName().endsWith(“.xml”)){
myJarXmlFiles.add(entry.getName());
}
}
}否则{
//失败
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
此代码演示如何在应用程序的类路径上找到jar的路径,并列出文件夹的内容
// you need to get of a URL of any class in your jar
URL url = Appender.class.getProtectionDomain().getCodeSource()
.getLocation();
File file = new File(url.getFile());
System.out.println(file.getCanonicalPath());
JarFile jar = new JarFile(file);
Enumeration<JarEntry> i = jar.entries();
while (i.hasMoreElements()) {
JarEntry e = i.nextElement();
if (e.getName().startsWith("META-INF/")) {
System.out.println(e.getName());
}
}
jar.close();
没有什么好办法。如果您不介意对springcore
的依赖,那么它们有一个很好的方法,可以抽象出jar和目录之间的差异
PathMatchingResourcePatternResolver resolver =
new PathMatchingResourcePatternResolver(MyClass.class.getClassLoader());
Resource[] xmls = resolver.getResources("classpath*:XML/*.xml");
可能重复:我以前见过这个问题,但他们没有使用“XML/*.XML”模式。我认为这是这里的主要问题。这在从JAR运行时有效,但在运行调试时无效。这正是OP所要求的:/这很尴尬,因为我希望在从Eclipse启动应用程序时访问这些文件。这是不可能的吗?
jar:file:/C:/temp/.repository/log4j/log4j/1.2.17/log4j-1.2.17.jar!/org/apache/log4j/Appender.class
C:\temp\.repository\log4j\log4j\1.2.17\log4j-1.2.17.jar
META-INF/MANIFEST.MF
META-INF/
META-INF/LICENSE
META-INF/NOTICE
META-INF/maven/
META-INF/maven/log4j/
META-INF/maven/log4j/log4j/
META-INF/maven/log4j/log4j/pom.properties
META-INF/maven/log4j/log4j/pom.xml
PathMatchingResourcePatternResolver resolver =
new PathMatchingResourcePatternResolver(MyClass.class.getClassLoader());
Resource[] xmls = resolver.getResources("classpath*:XML/*.xml");