java相同的代码在两个不同的包上表现不同
我有一组代码,它们对于两种不同的产品是通用的,但是代码的一部分对于每种产品的行为是不同的
URL wsdlURL = IntegrationLandscapeService.class.getClassLoader().getResource("IntegrationLandscapeService.wsdl");
对于一个设置,它给出了绝对路径,而对于另一个设置,它给出了相对路径,这导致了问题,我的要求是获得问题的绝对路径
代码流:
该调用是从主类文件发出的,并且从主类文件中的公共代码中查找位于LandScapeService中的WSDL。罐子
更新:
代码的下一行是
IntegrationLandscapeService landscapeService = new IntegrationLandscapeService(wsdlURL);
但是我得到了下面的错误
failed [Failed to access the WSDL at: jar:file:/
tracker.jar!/lib/t24-IF_IntegrationLandscapeService-IntegrationLandscapeService-jwc.jar!/IntegrationLandscapeService.wsdl
.It failed with:
\tracker.jar (The system cannot find the file specified).]
Jar的屏幕截图
# 1 楼答案
您可以使用getAbsolutePath
这不是你要找的吗
# 2 楼答案
错误显示两个“!”在路径中,指示资源位于嵌入/嵌套/内部jar文件中。使用fat/捆绑jar方法(其中一个jar文件包含其他jar文件)的产品需要一些技巧才能从嵌入的jar文件加载类和资源。您可以在http://www.jdotsoft.com/JarClassLoader.php(*)上阅读相关信息
无论如何,您对此无能为力,因为Java本机不支持从嵌入式JAR加载资源。提供我上面提到的“诡计”的实现需要解决这个问题(有些实现比其他实现更好,请参见上面的链接)
另一个带有Par文件的产品表示使用OSGi,它只需要适当的配置来保持资源加载工作。有一个答案here解释了您的情况和解决方案选项
(*)Spring boot还有一些很好的文档和解决方案,但我还没有尝试将该解决方案用于非Spring应用程序。有关更多信息,请参见https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html
# 3 楼答案
这是因为JAR中的文件没有被视为常规文件,因为它们没有展开,也不能直接用于文件资源管理器
在Jar中,如果引用了这些文件,您将从Jar文件的根目录获取路径
请确保您拥有Jar位置的类路径条目。这将有助于找到资源。否则,请尝试以下代码(不确定它是否适用于您的情况,请尝试一下)
请参阅此答案以了解更多信息Stack Overflow comment