【问题标题】:java.io.FileNotFoundException when running on server在服务器上运行时出现 java.io.FileNotFoundException
【发布时间】:2017-06-28 14:24:10
【问题描述】:

我正在使用带有 Spring 4.3.1.RELEASE 的 Java 8。

我有以下代码,当我将 main 作为 java 应用程序运行时,它可以工作。但是,当我将它部署到 Tomcat 服务器并有一个线程调用它时,我收到以下错误:

错误

java.io.FileNotFoundException: src/main/resources/certificates/apns-prod-cert.p12(没有这样的文件或目录)

代码

private static String PATH_TO_P12_CERT = "src/main/resources/certificates/apns-prod-cert.p12";

private String sendIOSPushNotification(String device_token, String topics, String title, String message)
        throws Exception {
    ApnsServiceBuilder serviceBuilder = APNS.newService();
        serviceBuilder.withCert(PATH_TO_P12_CERT, CERT_PASSWORD)
                .withProductionDestination();
    ApnsService service = serviceBuilder.build();
    String payload = APNS.newPayload()
            .alertBody(message)
            .alertTitle(title)
            .sound("default")
            .customField("custom", "custom value").build();
    service.push(device_token, payload);

    return "iOS Push Notification: " + title + " " + message;
}

问题

如何定义apns-prod-cert.p12 的路径?

谢谢

更新

更新

【问题讨论】:

  • 如果您在 IDE 之外运行代码,则没有 /src/main/resources 目录。使用this.getClass().getResourceAsStream("/certificates/apns-prod-cert.p12")
  • 那我应该通过/certificates/apns-prod-cert.p12引用它吗?
  • 在典型的 WAR 环境(部署到 Tomcat)中,甚至没有 文件

标签: java spring tomcat


【解决方案1】:

如果您在 IDE 之外运行代码,则没有 /src/main/resources 目录。使用serviceBuilder.withCert(this.getClass().getResourceAsStream("/certificates/apns-prod‌​-cert.p12"),CERT_PASSWORD)

【讨论】:

    【解决方案2】:

    我有一个解决方案。我不认为它是最优雅的,但我会暂时使用它,直到出现更好的东西。

    我将资源 apns-prod-cert.p12 移动到与使用它的类 (NotificationServiceImpl) 相同的目录中。然后我执行以下操作:

    String certPath = NotificationServiceImpl.class.getResource("apns-prod-cert.p12").getPath();
    

    这不是最好的,因为这意味着我必须将 apns-prod-cert.p12 与我通常希望在 resources 下的 java 打包。

    【讨论】:

    • 是的,这不是最好的方法。
    【解决方案3】:

    您应该考虑在您的生产环境中您没有 src 文件夹。相反,资源文件夹中的所有内容都放在类路径中。试试:

    private static String PATH_TO_P12_CERT = "classpath:certificates/apns-prod-cert.p12";
    

    【讨论】:

    • 谢谢,我会试试的。不知道为什么有人给你投了反对票?
    • 如果不起作用,请尝试使用 PATH 常量创建一个文件,并将该文件传递给您的方法。
    • 您认为new FileInputStream("classpath:certificates/apns-prod-cert.p12"); 有效吗?这就是内部发生的事情:github.com/notnoop/java-apns/blob/master/src/main/java/com/…
    • FileInputStream 在哪里?我在代码中没有看到这个
    • 查看提供的链接第 156 行
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2014-10-31
    • 2015-05-09
    • 2020-03-17
    相关资源
    最近更新 更多