相同的代码在两个不同的包装上表现不同

时间:2017-07-06 07:12:45

标签: java jar

我有一组代码,这些代码对于两种不同的产品是通用的,但代码的一部分对每种产品的行为都不同

URL wsdlURL = IntegrationLandscapeService.class.getClassLoader().getResource("IntegrationLandscapeService.wsdl");

对于一个设置,它给出了绝对路径,而另一个设置给出了相对路径,这导致了问题,我的要求是获得问题的绝对路径。

包装: enter image description here

代码流程

调用是从Main Class File进行的,并且在CommonCode的公共代码中调用它正在寻找位于LandScapeService.jar中的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的屏幕截图

enter image description here

3 个答案:

答案 0 :(得分:2)

错误显示两个'!'在路径中指示资源位于嵌入/嵌套/内部jar文件中。使用fat / bundled-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

答案 1 :(得分:0)

您可以使用getAbsolutePath

File file = new File(url.getPath());
String path = file.getAbsolutePath();

不是你想要的吗?

答案 2 :(得分:0)

这是因为JAR中的文件不会被视为常规文件,因为它们不会被展开,也不能直接用于文件资源管理器。

在Jar中,如果引用文件,您将从JAR文件的根目录获取路径。

请确保您拥有Jar位置的类路径条目。这将有助于找到资源。否则,请尝试以下代码(不确定它是否适用于您的情况,请尝试一下)。

String resource = "/com/example/IntegrationLandscapeService.wsdl"; //package structure of the file
URL res = IntegrationLandscapeService.class.getResource(resource);

请参阅此答案以了解更多Stack Overflow comment