Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从指向jar中目录的非层次URI创建文件_Java_Jar_Uri - Fatal编程技术网

Java:从指向jar中目录的非层次URI创建文件

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

我使用反射查找某个包中的所有目录,然后将这些目录作为java.io.Files返回,以便从中提取类文件。我获取包中所有目录的方法如下:

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
这样的东西。使用
文件
无法解决此问题。