1

我已经使用 Axis2 创建了一个 Web 服务客户端。我想将客户端打包成一个jar,这样我就可以在其他几个项目中使用它。客户端使用 Axis2 WS-Security 模块“壁垒”。这个模块,rampart.mar(不是错字!)必须存在于 Axis 的“存储库路径”中,位于名为“modules”的目录中。客户端还需要一个安全策略文件 policy.xml。最后两个的位置是通过 Spring 注入的,但由于它们不会更改,我想将它们打包到 jar 中。

如果您注入 File 对象,例如:

<bean id="webserviceStubFactory" class="com.company.WebserviceStubFactory">
    <constructor-arg value="classpath:policy.xml"/>
</bean>

直接运行/测试项目时它会正常工作。但是,当您将其打包到 jar 中时,您会得到

java.io.FileNotFoundException: class path resource [policy.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/path/to/webservice-0.8.jar!/policy.xml

这是一个众所周知的 Spring“问题”:constructor-arg 被解析为 Spring ClasspathResource 实例,它不支持 getFile(),因为 File 实例不能引用 jar 中的内容。解决方案非常简单:将构造函数更改为采用 Resource 而不是文件并直接使用 InputStream。但是,这不适用于 Axis2 存储库路径,因为我只能指定存储库的完整路径,而 Axis2 内部会确定 armart.mar 所在的位置。

因此,问题基本上归结为:是否可以使用 Spring 在 jar 中注入路径(即使它只是 /),并让其他库从该路径读取,就好像它是一个常规文件系统一样?我猜它不是,但我想确定的是,在开发/测试/生产环境上安装外部“轴存储库”之前,并在周围放置几个rampart.mar 副本。

4

1 回答 1

1

Spring 只能做很多事情来隐藏底层 JavaSE API 的不一致性。接口上的各种getXYZ方法在Resource文档中都带有警告,例如getFile()

Throws:
    IOException - if the resource cannot be resolved as absolute file path, 
    i.e. if the resource is not available in a file system

JAR 中的资源不是“在文件系统上”,因此这永远不会起作用。

在您的情况下,您将不得不解决 Axis2 对文件进行操作的要求,但手动确保文件存在。换句话说,用于Resource.getInputStream()提取 JAR 资源的内容并将其复制到File本地文件系统上的临时文件,然后将其传递 FileAxis2。

于 2010-02-02T08:26:51.373 回答