在哪里放一个jar需要加载的文件

时间:2015-02-04 16:23:20

标签: java jar classpath

我有jar将使用websockets连接到网站进行通信。该网站是 SSL 网站,因此我有.ts程序需要加载文件。以下是用于加载.ts文件的java代码

    System.setProperty("javax.net.ssl.trustStore",
            "foo.ts");
    System.setProperty("javax.net.ssl.trustStorePassword", "password");

并且java程序在一个名为foo.web的包中,因此当打包到jar中时,它位于一个名为foo的文件夹中,然后有一个名为web的子文件夹。

我的问题是,我是否将foo.ts放在我的类所在的foo/web文件夹中,或者我应该将foo.ts文件放在jar的根目录下来加载我的用于加载foo.ts文件的程序中的当前代码?

3 个答案:

答案 0 :(得分:2)

System.setProperty周围的工作...需要'常规'文件路径,正在使用机制来解析类资源:

  • 将ts文件放在某个包下的代码文件夹中(不是普通的网络代码) 库jar代码)
  • 在同一个包的课程中,请致电:

a

//this will find the file in the package folder
URL cert = this.getClass().getResource("ts");
String path = cert.toString(); //this translate the url to file system location
if (path.startsWith("file:"))
path = path.substring("file:".length()+1,path.length()); //getting rid of file prefix as not needed
System.setProperty("javax.net.ssl.trustStore", path);

如果你想在jar中包含ts,类似的技巧,但不是路径(这将无法工作,阅读内容并将其保存到临时位置

in  = this.getClass().getResourceAsStream(wsdl);
... save it to tmp location
System.setProperty("javax.net.ssl.trustStore", your tmp location);

答案 1 :(得分:1)

我假设您有未签名的自生成证书,您希望将其用于ssl连接。

通过ssl服务内容的部分(您的tomcat在443或apache上)需要知道证书及其密钥(在tomcat或apache文件中配置)。 您在该服务器上部署的Java代码不需要知道证书,甚至不需要知道ssl。

但是想要连接到这样的服务器的代码,让我们说Web服务客户端将抛出异常(并且非常模糊btw),因为它无法识别证书并拒绝连接(不同于Web浏览器哪个对话框可以让你添加例外)。 因此,客户端代码需要在oppening连接之前添加到其TrustedStore的证书(使用System.property的技巧完成工作)。由于它,客户端可以信任连接,因为您的远程证书与他已有的远程证书匹配。

如果您的客户端代码恰好在同一个tomcat上运行,它仍然需要将证书添加到商店,因为443处的连接器的配置选项仅将证书暴露给可以读取它的任何人,但不添加它到tomcat的知识库池。为此,您需要-catava.net.ssl.trustStore = YOUR_TS -Djavax.net.trustStorePassword =用于tomcat启动的PASS选项,或者应用程序代码中的System.setProperty。

答案 2 :(得分:0)

javax.net.ssl.trustStore属性的值是指向磁盘上信任库的位置的文件路径。如果您没有指定文件夹,它将假定该程序的当前工作目录,该目录很可能是调用JVM的位置。如果您不确定当前的工作目录是什么,可以从user.dir系统属性获取它。

System.getProperty("user.dir"));