有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

包装: enter image description here

代码流:

该调用是从主类文件发出的,并且从主类文件中的公共代码中查找位于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的屏幕截图

enter image description here


共 (3) 个答案

  1. # 1 楼答案

    您可以使用getAbsolutePath

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

    这不是你要找的吗

  2. # 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. # 3 楼答案

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

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

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

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

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