getResource в OpenJdk выдает исключение java.nio.file.NoSuchFileException

Приложение: Spring Boot,
Изображение: OpenJDK 8,
PaaS: Openshift,
Пакет: jar,
Ошибка: нет такой ошибки файла. java.nio.file.NoSuchFileException
Расположение файла: /servicename/src/main/resources/cert/trust.cer
Местоположение ошибки: String certs = readFile ((trustCertPath) .getPath (), Charset.defaultCharset ( ));
Местоположение ошибки после обновления 1: try (InputStream is = classloader.getResourceAsStream (resourcePath)) имеет значение null.

Я использовал cert / trust.cer в качестве пути. Поскольку это не сработало, я попробовал с /cert/trust.cer, trust.cer, ./cert/trust.cer. Мне удалось запустить этот класс локально с помощью Windows (/cert/trust.cer), но он не работает из командной строки, а также не работает при развертывании явно.

Обновление 1: я использую getResourceAsStream (cert / trust.cer). Inputstream - это результат, равный нулю.

public class CertsUtility implements InitializingBean {
public static final Logger logger = LoggerFactory.getLogger("CertsUtility");
private String keystorePaaS;
private String keystorePass;
private String CertPath = "cert/trust.cer";

public void setKeystorePaaS(String keystorePaaS) {
    this.keystorePaaS = keystorePaaS;
}

public void setKeystorePass(String keystorePass) {
    this.keystorePass = keystorePass;
}

static File getPath(String path) {
    URL url = CertsUtility.class.getClass().getResource(path);
    if (url != null) {
        File file = new File(url.getPath());
        return file;
    } else {
        File file = new File(path);
        return file;
    }
}

static String getResourceFileAsString(String resourcePath) throws IOException {
    ClassLoader classloader = ClassLoader.getSystemClassLoader();
    try (InputStream is = classloader.getResourceAsStream(resourcePath)) {
        if (is == null)
            return null;
        try (InputStreamReader isr = new InputStreamReader(is)) {
            BufferedReader reader = new BufferedReader(isr);
            String targetString = reader.lines().collect(Collectors.joining());
            return targetString;
        }
    }

}

void genIndividualandLoad() throws KeyStoreException, FileNotFoundException, NoSuchAlgorithmException,
        CertificateException, IOException, InterruptedException {
    try {
        KeyStore keyStore = KeyStore.getInstance("JKS");
        InputStream fileInputStream = new FileInputStream(keystorePaaS);
        keyStore.load(fileInputStream, keystorePass.toCharArray());
        fileInputStream.close();
        String certs = readFile((trustCertPath).getPath(), Charset.defaultCharset());
        String[] certificates = certs.split("(?<=-----END CERTIFICATE-----\n)");

        for (int i = 0; i < certificates.length - 1; i++) {
            String individualName = getPath(CertPath).getParent() + i + ".cer";
            try (FileOutputStream outputStream = new FileOutputStream(individualName)) {
                byte[] strToBytes = certificates[i].getBytes();
                outputStream.write(strToBytes);
                try (InputStream inStream = new FileInputStream(individualName)) {
                    CertificateFactory cf = CertificateFactory.getInstance("X.509");
                    X509Certificate cert = (X509Certificate) cf.generateCertificate(inStream);
                    keyStore.setCertificateEntry("" + i, cert);
                }
                FileOutputStream fileOutputStream = new FileOutputStream(getPath(keystorePaaS));
                keyStore.store(fileOutputStream, keystorePass.toCharArray());
                fileOutputStream.close();
                outputStream.close();
            }
        }
    } catch (KeyStoreException e) {
        logger.error("| genIndividualandLoad() | Keystore exception occurred", e);
    } catch (FileNotFoundException e) {
        logger.error("| genIndividualandLoad() | File not found exception occurred", e);
    } catch (NoSuchAlgorithmException e) {
        logger.error("| genIndividualandLoad() | Algorithm related exception occurred", e);
    } catch (CertificateException e) {
        logger.error("| genIndividualandLoad() | X.509 Certificate exception occurred", e);
    } catch (IOException e) {
        logger.error("| genIndividualandLoad() | I/O exception occured", e);
    }
}

public void afterPropertiesSet() throws KeyStoreException, FileNotFoundException, NoSuchAlgorithmException,
        CertificateException, IOException, InterruptedException {
    genIndividualandLoad();
}

}


person MAV    schedule 28.05.2020    source источник
comment
Где на самом деле находится сертификат на диске? Можете ли вы выполнить команду типа find / -name 'trust.cer', чтобы найти его?   -  person omajid    schedule 28.05.2020
comment
@omajid: Нет доступа к терминалу на стручках.   -  person MAV    schedule 28.05.2020
comment
Можете ли вы реализовать find в java? Попросите ли что-нибудь в вашем приложении пройтись по всем файлам, начинающимся с /, чтобы найти trust.cert и распечатать путь?   -  person omajid    schedule 29.05.2020
comment
Ваш сертификат находится в cert / trust.cer (из корня пути к классам), и вы пытаетесь получить доступ к trust.cer, не упоминая папку cert /. Вы уверены, что это правильно?   -  person    schedule 29.05.2020
comment
позвольте мне отредактировать его. Сначала, когда я попытался исправить проблему, я использовал cert / trust.cer, и он не работал с getResource.   -  person MAV    schedule 29.05.2020
comment
Не могли бы вы загрузить JAR, открыть его с помощью ZIP-менеджера и проверить, где на самом деле находится файл сертификата относительно корневой папки?   -  person    schedule 29.05.2020
comment
@Taschi: Не обращайте внимания на мой предыдущий комментарий, там много чего не хватало. Я пытался получить древовидную структуру, но позвольте мне попробовать еще раз.   -  person MAV    schedule 29.05.2020
comment
@Taschi: BOOT-INF - ›классы -› сертификат, структура папок пакета, весна. Cert имеет trust.cer, а в папке пакета есть несколько подпапок, ведущих к файлам .class. Дайте мне знать, если в этом есть смысл. Я использую Maven, и все в норме, простое приложение для загрузки Spring.   -  person MAV    schedule 29.05.2020
comment
Я удалил свой предыдущий комментарий, потому что он был совершенно неправильным.   -  person    schedule 29.05.2020


Ответы (2)


Вы пытаетесь загрузить сертификат как файл, который будет работать, если это действительно файл в вашей файловой системе (т.е. в вашем локальном рабочем пространстве), но не тогда, когда сертификат вложен в ваш JAR-файл.

Скорее нужно сделать что-то вроде

getClass().getClassLoader().getResourceAsStream("cert/trust.cer");

а затем читать из полученного потока.

person Community    schedule 28.05.2020
comment
Я реализовал getResourceAsStream (resourcePath), но это приводит к нулю с помощью cert / trust.cer - person MAV; 29.05.2020
comment
Вам необходимо попробовать другой загрузчик классов, проверить этот вопрос и множество ответов на него: stackoverflow. com / questions / 16570523 / Или вы можете попробовать один из подходов, перечисленных здесь: baeldung.com/spring-classpath-file-access - я бы предпочел, вероятно, метод @Value. - person ; 29.05.2020

Я использовал ClassPathResource из org.springframework.core.io.ClassPathResource для решения этой проблемы.

person MAV    schedule 28.09.2020