【问题标题】:Same code behaving differently on two different packaging相同的代码在两个不同的包装上表现不同
【发布时间】:2017-12-10 01:23:26
【问题描述】:

我有一组代码,它们适用于两种不同的产品,但部分代码对每种产品的行为不同

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

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

包装:

代码流程:

调用是从主类文件中进行的,并且从那里的 CommonCode in common code 它正在寻找位于 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).]

罐子截图

【问题讨论】:

  • 你为什么在乎?导致什么问题?只要您在每种情况下都获得一个有效的 URL,是什么问题?
  • @EJP。我已经更新了这个问题。请看一下。

标签: java jar


【解决方案1】:

错误显示两个“!”在指示资源位于嵌入式/嵌套/内部 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 了解更多信息。

【讨论】:

  • 我已经浏览了您提供的链接,因为类加载对我来说是新的,我正在努力实现部分。会回复你的。很快谢谢:)
【解决方案2】:

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

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

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

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

参考这个答案了解更多Stack Overflow comment

【讨论】:

  • 它失败了:从 jar:file:/tracker.jar!/lib/IntegrationLandscapeService.jar!//IntegrationLandscapeServiceWS 打开流时得到 \tracker.jar(系统找不到指定的文件)。 wsdl.] 我什至附上了 jar 的屏幕截图。
【解决方案3】:

你可以使用getAbsolutePath

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

这不是你要找的吗?

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 2023-03-27
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2022-11-29
    • 2019-07-08
    相关资源
    最近更新 更多