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

Where to put file that a jar needs to load

我有一个 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 文件放在要在加载 foo.ts 文件的程序中用我当前的代码加载 jar?

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

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

解决 System.setProperty...需要 'regular' 文件路径,正在使用机制来解析 class 资源:

  • 将 ts 文件放在你的代码文件夹下的某个包下(普通的网页代码不是 库 jar 代码)
  • 在同一包的 class 中,调用:

一个

//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);

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

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

但是想要连接到这样的服务器的代码,可以说网络服务客户端将抛出异常(顺便说一句,非常模糊),因为它不会识别证书并拒绝连接(不像网络浏览器,它提供的对话框是让你添加一个例外)。 因此,客户端代码需要在打开连接之前将证书添加到其 TrustedStore(使用 System.property 的技巧可以完成这项工作)。多亏了它,客户端可以信任连接,因为您的远程证书与他已有的证书相匹配。

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