【问题标题】:Is it possible to access resources inside a jar through their path?是否可以通过路径访问 jar 内的资源?
【发布时间】:2014-07-23 17:11:28
【问题描述】:

我有一个通过 java 项目运行的 SoapUI 项目,该项目全部打包到一个 jar 中。该项目通过我的 IDE 解包后运行良好,但在通过命令行运行 jar 时遇到问题。这是导致问题的代码:

SoapUITestCaseRunner runner = new SoapUITestCaseRunner();
ClassLoader cl = MyClass.class.getClassLoader();
runner.setProjectFile(cl.getResource("project.xml").getFile());
runner.run();

run 方法尝试从 jar 中读取 xml 文件时出现问题。我是否有可能从 jar 中获得可以输入到 setProjectFile 方法的路径?我看到其他答案说要使用流,但这种方法只接受字符串。

这是堆栈跟踪:

2014-07-23 12:03:58,384 错误 [errorlog] com.eviware.soapui.support.SoapUIException: 无法从文件 [file:/C:/temp/MyJar.jar!/project.xml 加载项目] com.eviware.soapui.support.SoapUIException:无法从文件 [file:/C:/temp/MyJar.jar!/project.xml] 加载项目 在 com.eviware.soapui.impl.wsdl.WsdlProject.loadProject(WsdlProject.java:315) 在 com.eviware.soapui.impl.wsdl.WsdlProject.(WsdlProject.java:231) 在 com.eviware.soapui.impl.wsdl.WsdlProjectFactory.createNew(WsdlProjectFactory.java:41) 在 com.eviware.soapui.impl.wsdl.WsdlProjectFactory.createNew(WsdlProjectFactory.java:28) 在 com.eviware.soapui.tools.SoapUITestCaseRunner.runRunner(SoapUITestCaseRunner.java:329) 在 com.eviware.soapui.tools.AbstractSoapUIRunner.run(AbstractSoapUIRunner.java:188) 在 CommercialTests.ComTest.doTest(ComTest.java:14) 在 CommercialTests.ServiceTests.main(ServiceTests.java:8) 引起:java.io.FileNotFoundException: C:\temp\MyJar.jar!\project.xml(系统找不到指定的路径) 在 java.io.FileInputStream.open(本机方法) 在 java.io.FileInputStream.(未知来源) 在 java.io.FileInputStream.(未知来源) 在 sun.net.www.protocol.file.FileURLConnection.connect(未知来源) 在 sun.net.www.protocol.file.FileURLConnection.getInputStream(未知来源) 在 java.net.URL.openStream(未知来源) 在 com.eviware.soapui.impl.wsdl.support.wsdl.UrlWsdlLoader.handleFile(UrlWsdlLoader.java:180) 在 com.eviware.soapui.impl.wsdl.support.wsdl.UrlWsdlLoader.load(UrlWsdlLoader.java:116) 在 com.eviware.soapui.impl.wsdl.support.wsdl.UrlWsdlLoader.load(UrlWsdlLoader.java:96) 在 com.eviware.soapui.impl.wsdl.WsdlProject.loadProject(WsdlProject.java:297) ... 7 更多

【问题讨论】:

  • 看起来它需要一个本地文件(jarUrl 应该可以工作,否则)...您可能必须先将文件从 jar 中复制出来(可能复制到 tempFile 中),然后指向到那个。
  • 你建议我怎么做?
  • 而不是将 URL 直接传递给 runner.setProjectFile,而是创建一个新的 tempFile,并将内容写入磁盘,然后将 tempfile 的路径传递给 runner.setProjectFile
  • 它似乎也不喜欢那个选项。我尝试将文件复制到 jar 外的临时文件中,但它无法处理 jar 内的任何类型的路径。

标签: java jar soapui embedded-resource


【解决方案1】:

对于这样的事情,我通常会这样做:

URL res = getClass().getResource("/project.xml")    // is it at the root of your jar?!?!
File f = new File(res.getFile())
runner.setProjectFile(f.getCanonicalPath());

SoapUI,取决于它如何访问文件,在“真实”世界中可能需要它。以下是上述内容的资源密集型版本。

// locate your file in the jar resources
URL res = getClass().getResource("/project.xml")    // is it at the root of your jar?!?!
// locate the resource in the filesystem
File f = new File(res.getFile())
// copy the file out into the real filesystem
File target = new File(System.getProperty("java.io.tmpdir") + File.separator + f.getName())
java.nio.file.Files.copy(f.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING)
runner.setProjectFile(target.getCanonicalPath())

【讨论】:

  • 问题是“setProjectFile”方法只接受字符串,所以不接受“f”作为参数。
  • 我尝试使用 f.getPath 和 f.getAbsolutePath,但它们都给了我同样的错误。
  • 尝试第二个选项。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2011-02-08
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多