Java:从指向jar中目录的非层次URI创建文件
我使用反射查找某个包中的所有目录,然后将这些目录作为java.io.Files返回,以便从中提取类文件。我获取包中所有目录的方法如下:Java:从指向jar中目录的非层次URI创建文件,java,jar,uri,Java,Jar,Uri,我使用反射查找某个包中的所有目录,然后将这些目录作为java.io.Files返回,以便从中提取类文件。我获取包中所有目录的方法如下: private static List<File> findDirs(String packageName) throws IOException, UnsupportedEncodingException, URISyntaxException { List<File> result = new ArrayLis
private static List<File> findDirs(String packageName) throws IOException,
UnsupportedEncodingException, URISyntaxException {
List<File> result = new ArrayList<File>();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
URI uri = resource.toURI();
File f = new File(uri);// this line throws the exception
result.add(f);
}
return result;
}
private static List findDirs(字符串packageName)抛出IOException,
UnsupportedEncodingException,URISyntaxException{
列表结果=新建ArrayList();
ClassLoader ClassLoader=Thread.currentThread().getContextClassLoader();
断言类加载器!=null;
字符串路径=packageName.replace('.','/');
枚举资源=classLoader.getResources(路径);
while(resources.hasMoreElements()){
URL resource=resources.nextElement();
URI=resource.toURI();
File f=新文件(uri);//此行引发异常
结果:添加(f);
}
返回结果;
}
从源代码运行我的应用程序时,它工作得非常好。然而,一旦我部署并运行它,findDirs方法就会失败,因为文件构造函数抛出了一个IllegalArgumentsException“URI不是分层的”
我已经调试了代码,导致问题的URI是:
jar:file:/C:/Program%20Files/apache-activemq-5.5.1/bin/./lib/App.jar/com/demo/payload
然而,当从源代码运行时,我对URI没有问题:
文件:/C:/Marcus/JavaProjects/App/build/prod/classes/com/demo/payload
如何从一个非语法URI(如前面提到的URI)创建指向App.jar中有效负载目录的文件
我可以使用
JarURLConnection
创建一个指向App.jar本身的jar文件,然后可以获得一个指向我正在搜索的目录的JarEntry,但似乎无法将该条目转换为文件…期望您能够处理从\getResources(String)获得的所有内容是错误的
是有效的文件
引用。在您的运行案例中,它是应用程序/库的Jar中的一个文件的引用。您应该访问这些URL
s,例如:获取InputStream
s(URL#openStream
)来读取内容,而不是试图跳过文件
为了获得文件
s,你需要弄清楚什么时候你在查看一个jar内的URL,然后可能从ZIP中提取文件(因为jar是拉链),以便获得一个合适的一等公民文件
期望你能够处理从\getResources(String)得到的所有东西是错误的
是有效的文件
引用。在您的运行案例中,它是应用程序/库的Jar中的一个文件的引用。您应该访问这些URL
s,例如:获取InputStream
s(URL#openStream
)来读取内容,而不是试图跳过文件
为了获得文件
s,您需要确定何时查看一个jar内URL,然后可能从ZIP中提取文件(因为jar是ZIP),以便获得一个合适的一等公民文件
,只要您指向jar文件的内部,就可以使用java.util.ZIP.ZipFile
。只需将引用的jar文件加载到ZipFile
中,并使用它的getEntry
或entries
检索jar中的元素。只要指向jar文件的内部,就可以使用java.util.zip.ZipFile
。只需将引用的jar文件加载到ZipFile
中,并使用它的getEntry
或entries
来检索jar中的元素。-1,因为它根本无法回答问题(即使所述事实是有效的)同意,但不幸的是,我在这里使用的是其他人的代码,为了避免重写整个类,我需要findDirs方法返回一个指向目录的文件,不管该目录是在Jar中还是在文件系统中,有没有办法做到这一点?@stryba补充了关于从Zip获取内容的说明。但是,我不建议在生产设置中这样做-这很危险,类加载器可能会引用远程数据。@Romain:同意这不是问题的推荐解决方案-1,因为它根本不能回答问题(即使所述事实是有效的)同意,但不幸的是,我在这里使用其他人的代码,为了避免重写整个类,我需要findDirs方法返回一个指向目录的文件,不管该目录是在Jar中还是在文件系统中,有没有办法做到这一点?@stryba补充了关于从Zip获取内容的说明。但是,我不建议在生产设置中这样做-这很危险,类加载器可能会引用远程数据。@Romain:同意这不是一个推荐的解决方案,正如我在问题末尾所说的,我可以访问与我试图创建文件的目录对应的底层Zipentry,但是,我怎样才能从这个条目中创建一个java.io.File实例呢?问题是您是否需要一个List
,而不是像List
或List
这样的东西。使用File
无法解决此问题。正如我在问题末尾所说,我能够访问与我试图创建文件的目录相对应的底层Zipentry,但是,我怎样才能从这个条目中创建一个java.io.File实例呢?问题是您是否需要一个List
,而不是像List
或List
这样的东西。使用文件
无法解决此问题。