3

我的 Web 应用程序的类路径中有一些资源文件(在 JAR 中,如果重要的话)。我知道我可以通过调用 eg 来访问这些资源的内容SomeClassLoader.getResourceAsStream( "/samples/myscript.txt" )。我过去在爆炸未爆炸的WAR 文件中都成功地对此进行了测试。

但是,要与我的应用程序中的其他一些现有类集成,我需要为该文件提供一个 URLConnection 对象。我测试并确认调用getResource("/samples/myscript.txt").openConnection()分解的WAR 中有效(此外,调试显示结果是file:///分解文件的 URL)。

问题:该方法是否也适用于非爆炸(“打包?”)WAR?

(我目前无法轻松访问部署战争而不爆炸它们的服务器,因此为什么我要问而不是直接尝试它。此外,某些服务器(例如 Jetty、Tomcat ——即使使用unpackWARs="false")允许非爆炸部署,但在幕后,他们解开战争,有效地表现得像一个爆炸的部署——而且,显然,工作正常。我认为过去给我带来麻烦的服务器是 Websphere 和 Weblogic)。

4

2 回答 2

2

我不相信。为此,您必须将JarUrlConnection用于其基础 URL 是另一个 JAR URL 的 JAR URL。如果我尝试这样做,我会得到:

java.net.MalformedURLException: no !/ in spec

'spec' 是 JarUrlConnection 所称的引用 JAR 内文件的路径。似乎对于像这样的 URL ,它会在第一个感叹号jar:jar:file:///outer.jar!/inner.jar!/myscript.txt处切断规范,然后作为规范拒绝。实际上,我们希望它在最后一个感叹号路径中切断规范,解开内部 URL(它指的是外部 JAR!)以用作基础。不幸的。我想不出任何办法来解决这个问题。inner.jar!/myscript.txt

于 2011-07-04T19:00:15.870 回答
0

与正在尝试的操作相关的注意事项:存档中的条目本身就是存档的条目,它具有两层包装,并且可能具有两层压缩。任何访问该条目的数据同时将中间存档仍然作为最外层存档中的条目的尝试都必须在检索该条目之前解压缩中间存档。

要访问双重嵌套存档,需要使用两种基本技术和一种高级技术:首先,最常见的是,将中间存档提取到临时文件中。其次,偶尔,可以通过中间存档的条目进行流式传输,但这非常慢,除非在非常有限的情况下,否则不建议这样做。第三,一种先进的技术是不压缩中间存档,然后创建一个偏移文件,其中包含指向中间存档的最外层存档区域的指针。我不确定这是否可以在任何地方完成,但它会避免其他两种技术的开销。

在任何情况下,访问双重嵌套条目都需要相当多的额外步骤,这对于简单的协议处理程序来说有点多。

另请注意,这是 JavaEE 应用程序归档的常见问题,它们被定义为多层归档:EAR -> (JAR | WAR | RAR)、WAR -> JAR 和 RAR -> JAR。JavaEE 创建三层嵌套档案。

于 2018-02-22T16:29:16.530 回答