Không thể tìm thấy đường dẫn chứng nhận hợp lệ cho mục tiêu được yêu cầu - lỗi ngay cả sau khi chứng nhận được nhập


205

Tôi có một máy khách Java đang cố truy cập vào một máy chủ có chứng chỉ tự ký.

Khi tôi cố gắng Đăng lên máy chủ, tôi gặp lỗi sau:

không thể tìm thấy đường dẫn chứng nhận hợp lệ cho mục tiêu được yêu cầu

Sau khi thực hiện một số nghiên cứu về vấn đề này, tôi đã làm như sau.

  1. Đã lưu tên miền máy chủ của tôi dưới dạng một root.certập tin.
  2. Trong JRE của máy chủ Glassfish của tôi, tôi đã chạy nó:
    keytool -import -alias example -keystore cacerts -file root.cer
  3. Để kiểm tra chứng chỉ đã được thêm vào cacert của tôi thành công, tôi đã làm điều này:
    keytool -list -v -keystore cacerts
    Tôi có thể thấy chứng chỉ có mặt.
  4. Sau đó tôi khởi động lại Glassfish và rút lại 'bài'.

Tôi vẫn nhận được lỗi này.

Tôi có cảm giác điều này là do Glassfish của tôi không thực sự đọc tệp cacert mà tôi đã sửa đổi mà có thể là một số khác.

Có ai trong số các bạn có vấn đề này và có thể đẩy tôi đi đúng hướng không?


1
Chỉ cần làm rõ "Tôi có một máy khách Java đang cố truy cập máy chủ có chứng chỉ tự ký.": Bạn đang nói về việc sử dụng chứng chỉ ứng dụng khách tự ký, phải không? Có cấu hình cụ thể nào cho cài đặt trình kết nối của bạn trên Glassfish (cụ thể là cài đặt cửa hàng tin cậy) không?
Bruno

"Tôi có một máy khách Java đang cố truy cập vào một máy chủ có chứng chỉ tự ký.": Bạn đang nói về việc sử dụng các chứng chỉ ứng dụng khách tự ký, phải không? - Đúng.
TheCoder

1
Tôi đã tìm thấy 2 cài đặt trong Glassfish JVM: -Djavax.net.ssl.keyStore = $ {com.sun.aas.instanceRoot} /config/keystore.jks và -Djavax.net.ssl.trustStore = $ {com.sun. aas.instanceRoot} /config/cacerts.jks. Bây giờ tôi cần thêm bằng chứng nhận cho một trong số đó. Bạn có thể xác nhận đó là kho khóa tôi thêm nó vào không?
TheCoder

4
Trên máy chủ, kho khóa dành cho chứng chỉ máy chủ và khóa riêng của nó (kho khóa dành cho những gì "thuộc về" bên địa phương). Cửa hàng ủy thác dành cho các certs được sử dụng để xác minh lòng tin trong nhóm từ xa. Bạn nên thêm chứng chỉ ứng dụng khách vào cửa hàng ủy thác máy chủ của bạn. (Cũng thấy điều này , mặc dù Glassfish dường như không sử dụng vị trí mặc định của JRE.)
Bruno

Điều đó đã làm việc Bruno. Tôi đã thêm nó vào cửa hàng ủy thác Glassfish của tôi. Cám ơn rất nhiều vì sự giúp đỡ của bạn. Bạn cũng vậy Dirk.
TheCoder

Câu trả lời:


155

Thật không may - đó có thể là nhiều thứ - và rất nhiều máy chủ ứng dụng và các 'trình bao bọc' java khác có xu hướng chơi với các thuộc tính và 'riêng' của chúng có các móc khóa và những gì không. Vì vậy, nó có thể đang nhìn vào một cái gì đó hoàn toàn khác nhau.

Short of truss-ing - Tôi sẽ thử:

java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=trustStore ...

để xem nếu điều đó giúp. Thay vì 'tất cả' người ta cũng có thể đặt nó thành 'ssl', trình quản lý khóa và trình quản lý tin cậy - có thể giúp ích trong trường hợp của bạn. Đặt nó thành 'trợ giúp' sẽ liệt kê một cái gì đó như bên dưới trên hầu hết các nền tảng.

Bất kể - hãy đảm bảo rằng bạn hiểu đầy đủ về sự khác biệt giữa kho khóa (trong đó bạn có khóa riêng và chứng nhận bạn chứng minh danh tính của chính mình) và cửa hàng ủy thác (xác định bạn tin tưởng ai) - và thực tế là danh tính của chính bạn cũng có một 'chuỗi' niềm tin đến gốc - tách biệt với bất kỳ chuỗi nào đến một gốc bạn cần tìm ra 'ai' bạn tin tưởng.

all            turn on all debugging
ssl            turn on ssl debugging

The   following can be used with ssl:
    record       enable per-record tracing
    handshake    print each handshake message
    keygen       print key generation data
    session      print session activity
    defaultctx   print default SSL initialization
    sslctx       print SSLContext tracing
    sessioncache print session cache tracing
    keymanager   print key manager tracing
    trustmanager print trust manager tracing
    pluggability print pluggability tracing

    handshake debugging can be widened with:
    data         hex dump of each handshake message
    verbose      verbose handshake message printing

    record debugging can be widened with:
    plaintext    hex dump of record plaintext
    packet       print raw SSL/TLS packets

Nguồn: # Xem http://doad.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug


6
Cảm ơn rất nhiều! -Djavax.net.ssl.trustStore = / location_of / trustStore đã giải quyết vấn đề của tôi và thông tin gỡ lỗi cũng thực sự hữu ích.
RHE

5
java -Djavax.net.debug = all -Djavax.net.ssl.trustStore = trustStore ... đưa ra lỗi dưới đây: Lỗi: Không thể tìm hoặc tải lớp chính ...
rohith

1
Tất nhiên, bạn cũng có thể cần chỉ định mật khẩu của Truststore với -Djavax.net.ssl.trustStorePassword = changeit
user1754036

18

Đây là giải pháp, hãy theo liên kết dưới đây Từng bước:

http://www.mkyong.com/webservice/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

JAVA FILE: thiếu trên blog

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */



import java.io.*;
import java.net.URL;

import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

public class InstallCert {

    public static void main(String[] args) throws Exception {
    String host;
    int port;
    char[] passphrase;
    if ((args.length == 1) || (args.length == 2)) {
        String[] c = args[0].split(":");
        host = c[0];
        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
        String p = (args.length == 1) ? "changeit" : args[1];
        passphrase = p.toCharArray();
    } else {
        System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
        return;
    }

    File file = new File("jssecacerts");
    if (file.isFile() == false) {
        char SEP = File.separatorChar;
        File dir = new File(System.getProperty("java.home") + SEP
            + "lib" + SEP + "security");
        file = new File(dir, "jssecacerts");
        if (file.isFile() == false) {
        file = new File(dir, "cacerts");
        }
    }
    System.out.println("Loading KeyStore " + file + "...");
    InputStream in = new FileInputStream(file);
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(in, passphrase);
    in.close();

    SSLContext context = SSLContext.getInstance("TLS");
    TrustManagerFactory tmf =
        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ks);
    X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
    SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
    context.init(null, new TrustManager[] {tm}, null);
    SSLSocketFactory factory = context.getSocketFactory();

    System.out.println("Opening connection to " + host + ":" + port + "...");
    SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
    socket.setSoTimeout(10000);
    try {
        System.out.println("Starting SSL handshake...");
        socket.startHandshake();
        socket.close();
        System.out.println();
        System.out.println("No errors, certificate is already trusted");
    } catch (SSLException e) {
        System.out.println();
        e.printStackTrace(System.out);
    }

    X509Certificate[] chain = tm.chain;
    if (chain == null) {
        System.out.println("Could not obtain server certificate chain");
        return;
    }

    BufferedReader reader =
        new BufferedReader(new InputStreamReader(System.in));

    System.out.println();
    System.out.println("Server sent " + chain.length + " certificate(s):");
    System.out.println();
    MessageDigest sha1 = MessageDigest.getInstance("SHA1");
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    for (int i = 0; i < chain.length; i++) {
        X509Certificate cert = chain[i];
        System.out.println
            (" " + (i + 1) + " Subject " + cert.getSubjectDN());
        System.out.println("   Issuer  " + cert.getIssuerDN());
        sha1.update(cert.getEncoded());
        System.out.println("   sha1    " + toHexString(sha1.digest()));
        md5.update(cert.getEncoded());
        System.out.println("   md5     " + toHexString(md5.digest()));
        System.out.println();
    }

    System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
    String line = reader.readLine().trim();
    int k;
    try {
        k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
    } catch (NumberFormatException e) {
        System.out.println("KeyStore not changed");
        return;
    }

    X509Certificate cert = chain[k];
    String alias = host + "-" + (k + 1);
    ks.setCertificateEntry(alias, cert);

    OutputStream out = new FileOutputStream("jssecacerts");
    ks.store(out, passphrase);
    out.close();

    System.out.println();
    System.out.println(cert);
    System.out.println();
    System.out.println
        ("Added certificate to keystore 'jssecacerts' using alias '"
        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

    private final X509TrustManager tm;
    private X509Certificate[] chain;

    SavingTrustManager(X509TrustManager tm) {
        this.tm = tm;
    }

    public X509Certificate[] getAcceptedIssuers() {
        throw new UnsupportedOperationException();
    }

    public void checkClientTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        throw new UnsupportedOperationException();
    }

    public void checkServerTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        this.chain = chain;
        tm.checkServerTrusted(chain, authType);
    }
    }

}

3
Giải pháp này hiệu quả với tôi, nhưng nó cần một thay đổi nhỏ trong lớp riêng SavingTrustManager:public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Richard

1
@ Richard, @ Paul, @ user6258309 Tôi đã gặp lỗi Ngoại lệ trong luồng "chính" java.net.SocketTimeoutException: Đọc hết thời gian tại java.net.SocketInputStream.socketRead0 (Phương thức gốc) tại java.net.SocketInputStream.socketRead (Nguồn không xác định ) Làm thế nào tôi có thể khắc phục điều này
Renjith Krishnan

5
Điều này 'vì vậy, sự thận trọng' là không an toàn triệt để. Không được dùng.
Hầu tước Lorne

9
Câu trả lời này chủ yếu là mã. Nó không giải thích tại sao hoặc tại sao nó không hoạt động.

13

Bạn cần định cấu hình Thuộc tính hệ thống JSSE, cụ thể là trỏ đến kho chứng chỉ ứng dụng khách.

Thông qua dòng lệnh:

java -Djavax.net.ssl.trustStore=truststores/client.ts com.progress.Client

hoặc thông qua mã Java:

import java.util.Properties;
    ...
    Properties systemProps = System.getProperties();
    systemProps.put("javax.net.ssl.keyStorePassword","passwordForKeystore");
    systemProps.put("javax.net.ssl.keyStore","pathToKeystore.ks");
    systemProps.put("javax.net.ssl.trustStore", "pathToTruststore.ts");
    systemProps.put("javax.net.ssl.trustStorePassword","passwordForTrustStore");
    System.setProperties(systemProps);
    ...

Để biết thêm tham khảo chi tiết trên trang web RedHat .


Có cùng một vấn đề với Spring Boot, Spring Cloud microservice và chứng chỉ SSL tự ký. Tôi đã có thể đặt keyStore và keyStorePassword trong application.properations và làm cho nó hoạt động như thế ngay lập tức, nhưng không thành công khi làm điều tương tự với trustStore và trustStorePassword. Câu trả lời này làm việc cho tôi cho cửa hàng tin tưởng.
Mate imović

7

(đăng lại từ phản hồi khác của tôi )
Sử dụng keytool tiện ích cli từ phân phối phần mềm java để nhập chứng chỉ (và tin cậy! )

Mẫu vật:

  1. Từ cli thay đổi dir sang jre \ bin

  2. Kiểm tra keystore (file tìm thấy trong thư mục jre \ bin)
    keytool -list -keystore .. \ lib \ security \ cacerts
    Mật khẩu changeit

  3. Tải xuống và lưu tất cả các chứng chỉ trong chuỗi từ máy chủ cần thiết.

  4. Thêm chứng chỉ (trước khi cần xóa thuộc tính "chỉ đọc" trên tệp ".. \ lib \ security \ cacerts"), chạy: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -file "r: \ root.crt "

vô tình tôi tìm thấy một mẹo đơn giản như vậy. Các giải pháp khác yêu cầu sử dụng InstallCert.Java và JDK

nguồn: http://www.java-samples.com/showtutorial.php?tutorialid=210


6

Tôi đã có cùng một vấn đề với sbt .
Nó đã cố gắng tìm nạp các phụ thuộc từ repo1.maven.org qua ssl
nhưng cho biết nó "không thể tìm thấy đường dẫn chứng nhận hợp lệ cho url đích được yêu cầu".
Vì vậy, tôi đã theo dõi bài đăng này và vẫn không xác minh được kết nối.
Vì vậy, tôi đã đọc về nó và thấy rằng chứng chỉ gốc là không đủ, như được đề xuất bởi bài đăng, vì vậy -
điều làm việc cho tôi là nhập chứng chỉ CA trung gian vào kho khóa .
Tôi thực sự đã thêm tất cả các chứng chỉ trong chuỗi và nó hoạt động như một cơ duyên.


4

Giải pháp khi di chuyển từ JDK 8 sang JDK 10

JDK 10

root@c339504909345:/opt/jdk-minimal/jre/lib/security #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 80 entries

JDK 8

root@c39596768075:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 151 entries

Các bước khắc phục

  • Tôi đã xóa chứng chỉ JDK 10 và thay thế bằng JDK 8
  • Vì tôi đang xây dựng Docker Images, tôi có thể nhanh chóng làm điều đó bằng cách sử dụng các bản dựng nhiều giai đoạn
    • Tôi đang xây dựng một JRE tối thiểu bằng cách sử dụng jlinknhư/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...

Vì vậy, đây là các đường dẫn khác nhau và chuỗi các lệnh ...

# Java 8
COPY --from=marcellodesales-springboot-builder-jdk8 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts /etc/ssl/certs/java/cacerts

# Java 10
RUN rm -f /opt/jdk-minimal/jre/lib/security/cacerts
RUN ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts

2

Tôi đang làm việc trên một hướng dẫn cho các dịch vụ web REST tại www.udemy.com (REST Java Web Services). Ví dụ trong hướng dẫn nói rằng để có SSL, chúng ta phải có một thư mục có tên là "trust_store" trong dự án "client" nhật thực của tôi nên chứa tệp "lưu trữ khóa" (chúng tôi có dự án "client" để gọi dịch vụ và dự án "dịch vụ" có chứa dịch vụ web REST - 2 dự án trong cùng một không gian làm việc nhật thực, một khách hàng, dịch vụ còn lại là dịch vụ). Để đơn giản, họ nói sẽ sao chép "keystore.jks" từ máy chủ ứng dụng thủy tinh (glassfish \ domain \ domain1 \ config \ keystore.jks) mà chúng tôi đang sử dụng và đưa nó vào thư mục "trust_store" mà họ đã tạo cho tôi dự án khách hàng. Điều đó dường như có ý nghĩa: các certs tự ký trong máy chủ ' s key_store sẽ tương ứng với các certs trong client client_store. Bây giờ, làm điều này, tôi đã nhận được lỗi mà bài viết gốc đề cập. Tôi đã googled điều này và đọc rằng lỗi là do tệp "keystore.jks" trên máy khách không chứa chứng chỉ tin cậy / đã ký, chứng chỉ mà nó tìm thấy là tự ký.

Để làm cho mọi thứ rõ ràng, hãy để tôi nói rằng theo tôi hiểu, "keystore.jks" chứa các certs tự ký và tệp "cacerts.jks" chứa các certs CA (được ký bởi CA). "Keystore.jks" là "kho khóa" và "cacerts.jks" là "kho tin cậy". Như "Bruno", một nhà bình luận, nói ở trên, "keystore.jks" là cục bộ và "cacerts.jks" dành cho các máy khách từ xa.

Vì vậy, tôi đã nói với bản thân mình rằng, cá thủy tinh cũng có tệp "cacerts.jks", là tệp tin Trust_store của thủy tinh. cacerts.jsk được cho là chứa chứng chỉ CA. Và rõ ràng tôi cần thư mục trust_store của mình để chứa tệp lưu trữ khóa có ít nhất một chứng chỉ CA. Vì vậy, tôi đã thử đặt tệp "cacerts.jks" vào thư mục "trust_store" mà tôi đã tạo, trong dự án máy khách của mình và thay đổi các thuộc tính VM để trỏ đến "cacerts.jks" thay vì "keystore.jks". Điều đó đã thoát khỏi lỗi. Tôi đoán tất cả những gì nó cần là một chứng chỉ CA để làm việc.

Điều này có thể không lý tưởng cho sản xuất, hoặc thậm chí cho sự phát triển ngoài việc chỉ cần làm một cái gì đó để làm việc. Chẳng hạn, bạn có thể sử dụng lệnh "keytool" để thêm CA certs vào tệp "keystore.jks" trong máy khách. Nhưng dù sao thì hy vọng điều này ít nhất sẽ thu hẹp các tình huống có thể xảy ra ở đây để gây ra lỗi.

CSONG: Cách tiếp cận của tôi có vẻ hữu ích cho khách hàng (chứng chỉ máy chủ được thêm vào client trust_store), có vẻ như các nhận xét ở trên để giải quyết bài đăng gốc rất hữu ích cho máy chủ (chứng chỉ ứng dụng khách được thêm vào máy chủ trust_store). Chúc mừng.

Thiết lập dự án Eclipse:

  • Dự án MyClient
  • src
  • kiểm tra
  • Thư viện hệ thống JRE
  • ...
  • Trust_store
    --- cacerts.jks --- keystore.jks

Đoạn trích từ tệp MyClientProject.java:

static {
  // Setup the trustStore location and password
  System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
  // comment out below line
  System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
  //System.setProperty("javax.net.debug", "all");

  // for localhost testing only
  javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
        public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost");
        }

  });
}

1

Vấn đề của tôi là một Nhà môi giới bảo mật truy cập đám mây, NetSkope, đã được cài đặt trên máy tính xách tay công việc của tôi thông qua bản cập nhật phần mềm. Điều này đã thay đổi chuỗi chứng chỉ và tôi vẫn không thể kết nối với máy chủ thông qua máy khách java của mình sau khi nhập toàn bộ chuỗi vào kho khóa của tôi. Tôi đã tắt NetSkope và có thể kết nối thành công.


1

Trong trường hợp của tôi, tôi đã phải đối mặt với vấn đề vì trong quy trình tomcat của tôi, kho khóa cụ thể đã được đưa ra bằng cách sử dụng

-Djavax.net.ssl.trustStore=/pathtosomeselfsignedstore/truststore.jks

Trong đó tôi đã nhập chứng chỉ vào các hàm JRE / lib / security và các thay đổi không được phản ánh. Sau đó, tôi đã thực hiện bên dưới lệnh trong đó /tmp/cert1.test chứa chứng chỉ của máy chủ đích

keytool -import -trustcacerts -keystore /pathtosomeselfsignedstore/truststore.jks -storepass password123 -noprompt -alias rapidssl-myserver -file /tmp/cert1.test

Chúng tôi có thể kiểm tra lại nếu nhập chứng chỉ thành công

keytool -list -v -keystore /pathtosomeselfsignedstore/truststore.jks

và xem nếu máy chủ taget của bạn được tìm thấy chống lại bí danh rapidssl-myserver


0

Kiểm tra nếu các tập tin $JAVA_HOME/lib/security/cacertstồn tại! Trong trường hợp của tôi, nó không phải là một tệp mà là một liên kết đến /etc/ssl/certs/java/cacertsvà đây cũng là một liên kết đến chính nó (CÁI GÌ ???) do đó JVM không thể tìm thấy tệp.

Giải pháp: Sao chép tệp cacerts thực ( bạn có thể thực hiện từ JDK khác ) vào /etc/ssl/certs/java/thư mục và nó sẽ giải quyết vấn đề của bạn :)


thực sự JDK duy trì một liên kết và có thể để tương thích với các API, SDK cũ hơn ... Tôi đã quản lý thành công để làm điều tương tự ... Tôi đang chuyển từ JDK 8 sang JDK 10 và sử dụng Docker vì vậy tôi chỉ cần sao chép các đoạn trích từ một hình ảnh khác ... Tôi đã tạo liên kết và cách chính xác tương tự ...rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Marcello de Sales

-9

Hãy nói nếu bạn đang sử dụng các biến classpath như $ {JAVA_HOME} trong pom.xml.

<target>
                    <property name="compile_classpath" refid="maven.compile.classpath"/>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <property name="test_classpath" refid="maven.test.classpath"/>
                    <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                    <property name="jaxb-api.jar" value="${maven.dependency.javax.xml.bind.jaxb-api.jar.path}"/>
                    <property name="project_home" value="${PROJECT_HOME}"/>
                    <property name="java_home" value="${JAVA_HOME}"/>
                    <property name="ant_home" value="${ANT_HOME}"/>
                    <property name="common_home" value="${COMMON_HOME}"/>
                    <property name="JAXP_HOME" value="${common_home}/lib"/>
                    <property name="ejfw_home" value="${PROJECT_HOME}/lib"/>
                    <property name="weblogic_home" value="${WL_HOME}"/>
                    <property name="fw_home" value="${FW_HOME}"/>
                    <property name="env" value="${BUILDENV}"/>
                    <property name="tokenfile" value="${BUILDENV}${BUILDENV_S2S}.properties"/>

Trên các mục tiêu, thêm các biến classpath. tức là .., -DANT_HOME, -DJAVA_HOME

clean install -e -DPROJECT_HOME=..... -DANT_HOME=C:\bea1036\modules\org.apache.ant_1.7.1 -DJAVA_HOME=C:\bea1036\jdk160_31

1
Đường dẫn lớp và chứng chỉ không liên quan gì đến nhau.
Hầu tước Lorne

1
Tôi tin rằng bạn đã hiểu nhầm câu hỏi.
Dawood ibn Kareem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.