Tidak dapat menemukan jalur sertifikasi yang valid ke target - kesalahan yang diminta bahkan setelah sertifikat diimpor

206

Saya memiliki klien Java yang mencoba mengakses server dengan sertifikat yang ditandatangani sendiri.

Ketika saya mencoba mengirim ke server, saya mendapatkan kesalahan berikut:

tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta

Setelah melakukan penelitian tentang masalah ini, saya kemudian melakukan hal berikut.

  1. Menyimpan nama domain server saya sebagai root.cerfile.
  2. Di JRE server Glassfish saya, saya menjalankan ini:
    keytool -import -alias example -keystore cacerts -file root.cer
  3. Untuk memeriksa sertifikat yang berhasil ditambahkan ke cacert saya, saya melakukan ini:
    keytool -list -v -keystore cacerts
    Saya dapat melihat sertifikat itu ada.
  4. Saya kemudian restart Glassfish dan pensiun 'pos'.

Saya masih mendapatkan kesalahan yang sama.

Saya merasa ini karena Glassfish saya sebenarnya tidak membaca file cacert yang telah saya ubah tetapi mungkin yang lain.

Adakah di antara Anda yang memiliki masalah ini dan dapat mendorong saya ke arah yang benar?

TheCoder
sumber
1
Hanya untuk mengklarifikasi "Saya punya klien Java yang mencoba mengakses server dengan sertifikat yang ditandatangani sendiri.": Anda berbicara tentang menggunakan sertifikat klien yang ditandatangani sendiri, bukan? Apakah ada konfigurasi khusus untuk pengaturan konektor Anda di Glassfish (pengaturan trust store, khususnya)?
Bruno
"Saya punya klien Java yang mencoba mengakses server dengan sertifikat yang ditandatangani sendiri.": Anda sedang berbicara tentang menggunakan sertifikat klien yang ditandatangani sendiri, bukan? - Iya.
TheCoder
1
Saya telah menemukan 2 pengaturan di Glassfish JVM: -Djavax.net.ssl.keyStore = $ {com.sun.aas.instanceRoot} /config/keystore.jks dan -Djavax.net.ssl.trustStore = $ {com.sun. aas.instanceRoot} /config/cacerts.jks. Saya sekarang perlu menambahkan dengan cert ke salah satu dari mereka. Bisakah Anda mengonfirmasi itu adalah keystore yang saya tambahkan?
TheCoder
4
Di server, keystore adalah untuk kepastian server dan kunci privatnya (keystore adalah untuk apa yang "milik" pihak lokal). Truststore adalah untuk sertifikat yang digunakan untuk memverifikasi kepercayaan pada pihak jauh. Anda harus menambahkan sertifikat klien ke toko trust server Anda. (Lihat ini juga, meskipun Glassfish tampaknya tidak menggunakan lokasi default JRE.)
Bruno
Itu berhasil, Bruno. Saya menambahkannya ke toko kepercayaan Glassfish saya. Terima kasih banyak atas bantuannya. Anda juga Dirk.
TheCoder

Jawaban:

155

Sayangnya - bisa jadi banyak hal - dan banyak server aplikasi dan 'pembungkus' java lainnya cenderung bermain dengan properti dan 'miliknya' mengambil gantungan kunci dan apa yang tidak. Jadi mungkin melihat sesuatu yang sama sekali berbeda.

Singkatnya penahan - Saya akan mencoba:

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

untuk melihat apakah itu membantu. Alih-alih 'semua', seseorang juga dapat mengaturnya ke 'ssl', manajer kunci dan manajer kepercayaan - yang dapat membantu dalam kasus Anda. Mengaturnya ke 'bantuan' akan mencantumkan sesuatu seperti di bawah ini di sebagian besar platform.

Apapun - pastikan Anda sepenuhnya memahami perbedaan antara keystore (di mana Anda memiliki kunci pribadi dan sertifikat Anda membuktikan identitas Anda sendiri dengan) dan toko kepercayaan (yang menentukan siapa yang Anda percayai) - dan fakta bahwa identitas Anda sendiri juga memiliki 'rantai' kepercayaan ke root - yang terpisah dari rantai apa pun ke root yang Anda butuhkan untuk mencari tahu 'siapa' yang Anda percayai.

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

Sumber: # Lihat http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug

Dirk-Willem van Gulik
sumber
6
Terima kasih banyak! -Djavax.net.ssl.trustStore = / location_of / trustStore memecahkan masalah saya dan info debug juga sangat membantu.
RHE
5
java -Djavax.net.debug = all -Djavax.net.ssl.trustStore = trustStore ... memberikan kesalahan di bawah ini: Kesalahan: Tidak dapat menemukan atau memuat kelas utama ...
rohith
1
Tentu saja Anda mungkin perlu menentukan kata sandi truststore dengan -Djavax.net.ssl.trustStorePassword = changeit
user1754036
18

Ini solusinya, ikuti tautan di bawah ini Langkah demi langkah:

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

FILE JAWA: yang hilang dari 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);
    }
    }

}
pengguna6258309
sumber
3
Solusi ini berhasil untuk saya, tetapi perlu perubahan kecil di kelas privat SavingTrustManager:public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Richard
1
@ Richard, @ Paul, @ user6258309 Saya mendapat kesalahan Pengecualian di utas "utama" java.net.SocketTimeoutException: Membaca waktunya di java.net.SocketInputStream.socketRead0 (Metode Asli) di java.net.SocketInputStream.socketRead (Sumber Tidak Dikenal) ) Bagaimana saya bisa memperbaikinya
Renjith Krishnan
5
'Jadi; lusi' ini sangat tidak aman. Jangan gunakan.
Marquis of Lorne
9
Jawaban ini sebagian besar adalah kode. Itu tidak menjelaskan mengapa atau mengapa itu tidak berhasil.
13

Anda perlu mengkonfigurasi Properti Sistem JSSE, secara khusus arahkan ke toko sertifikat klien.

Melalui baris perintah:

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

atau melalui kode 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);
    ...

Untuk lebih banyak merujuk pada detail di situs RedHat .

Vic
sumber
Punya masalah yang sama dengan Spring Boot, Spring Cloud microservices, dan sertifikat SSL yang ditandatangani sendiri. Saya dapat mengatur keyStore dan keyStorePassword di application.properties dan membuatnya berfungsi seperti itu di luar kotak, tetapi tidak berhasil melakukan hal yang sama dengan trustStore dan trustStorePassword. Jawaban ini berhasil bagi saya untuk toko kepercayaan.
Mate Šimović
7

(repost dari respon saya yang lain )
Gunakan utilitas cli keytool dari distribusi perangkat lunak java untuk impor (dan kepercayaan! ) diperlukan sertifikat

Sampel:

  1. Dari cli change dir ke jre \ bin

  2. Periksa keystore (file yang ditemukan di jre \ direktori bin)
    keytool -list -keystore .. \ lib \ security \ cacerts
    Password changeit

  3. Unduh dan simpan semua sertifikat dalam rantai dari server yang dibutuhkan.

  4. Tambahkan sertifikat (sebelum harus menghapus atribut "read-only" pada file ".. \ lib \ security \ cacerts"), jalankan: keytool -ali REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ keamanan \ cacerts -file "r: \ root.crt "

secara tidak sengaja saya menemukan tip yang sangat sederhana. Solusi lain memerlukan penggunaan InstallCert.Java dan JDK

sumber: http://www.java-samples.com/showtutorial.php?tutorialid=210

Алексей Присяжный
sumber
6

Saya memiliki masalah yang sama dengan sbt .
Itu mencoba mengambil dependensi dari repo1.maven.org lebih dari ssl
tetapi mengatakan itu "tidak dapat menemukan jalur sertifikasi yang valid untuk url target yang diminta".
jadi saya mengikuti posting ini dan masih gagal memverifikasi koneksi.
Jadi saya membacanya dan menemukan bahwa sertifikat root tidak cukup, seperti yang disarankan oleh pos, jadi -
hal yang berhasil bagi saya adalah mengimpor sertifikat perantara CA ke dalam keystore .
Saya sebenarnya menambahkan semua sertifikat dalam rantai dan itu bekerja seperti pesona.

Danny Mor
sumber
4

Solusi saat bermigrasi dari JDK 8 ke 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

Langkah-langkah untuk memperbaikinya

  • Saya menghapus sertifikat JDK 10 dan menggantinya dengan JDK 8
  • Karena saya sedang membangun Gambar Docker, saya bisa dengan cepat melakukan itu menggunakan multi-stage builds
    • Saya sedang membangun JRE minimal menggunakan jlinksebagai/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...

Jadi, inilah jalur yang berbeda dan urutan perintah ...

# 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
Marcello de Sales
sumber
2

Saya sedang mengerjakan tutorial untuk layanan web REST di www.udemy.com (REST Java Web Services). Contoh dalam tutorial mengatakan bahwa untuk memiliki SSL, kita harus memiliki folder bernama "trust_store" di proyek "klien" gerhana saya yang harus berisi file "penyimpanan kunci" (kami memiliki proyek "klien" untuk memanggil layanan , dan proyek "layanan" yang berisi layanan web REST - 2 proyek di ruang kerja gerhana yang sama, satu klien, yang lain layanan). Untuk mempermudah, mereka mengatakan untuk menyalin "keystore.jks" dari server aplikasi glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks) yang kami gunakan dan memasukkannya ke dalam folder "trust_store" yang mereka buat untuk saya buat proyek klien. Itu tampaknya masuk akal: sertifikat yang ditandatangani sendiri di server ' s key_store akan sesuai dengan sertifikat di trust_store klien. Sekarang, melakukan ini, saya mendapatkan kesalahan yang disebutkan oleh posting asli. Saya telah memeriksa ini di Google dan membaca bahwa kesalahan itu disebabkan oleh file "keystore.jks" pada klien yang tidak mengandung sertifikat tepercaya / tandatangani, bahwa sertifikat yang ditemukannya ditandatangani sendiri.

Agar semuanya tetap jelas, izinkan saya mengatakan bahwa seperti yang saya pahami, "keystore.jks" berisi sertifikat yang ditandatangani sendiri, dan file "cacerts.jks" berisi sertifikat CA (ditandatangani oleh CA). "Keystore.jks" adalah "keystore" dan "cacerts.jks" adalah "toko kepercayaan". Seperti yang dikatakan "Bruno", seorang komentator di atas, "keystore.jks" adalah lokal, dan "cacerts.jks" adalah untuk klien jarak jauh.

Jadi, saya berkata pada diri sendiri, hei, glassfish juga memiliki file "cacerts.jks", yang merupakan file trust_store glassfish. cacerts.jsk seharusnya berisi sertifikat CA. Dan ternyata saya membutuhkan folder trust_store saya untuk memuat file penyimpanan kunci yang memiliki setidaknya satu sertifikat CA. Jadi, saya mencoba meletakkan file "cacerts.jks" di folder "trust_store" yang saya buat, pada proyek klien saya, dan mengubah properti VM untuk menunjuk ke "cacerts.jks" bukannya "keystore.jks". Itu menghilangkan kesalahan. Saya kira yang dibutuhkan hanyalah sertifikat CA untuk bekerja.

Ini mungkin tidak ideal untuk produksi, atau bahkan untuk pengembangan lebih dari sekadar mendapatkan sesuatu untuk bekerja. Misalnya Anda mungkin bisa menggunakan perintah "keytool" untuk menambahkan sertifikat CA ke file "keystore.jks" di klien. Tapi bagaimanapun juga semoga ini setidaknya mempersempit skenario yang mungkin terjadi di sini untuk menyebabkan kesalahan.

JUGA: pendekatan saya sepertinya berguna untuk klien (cert server ditambahkan ke client trust_store), sepertinya komentar di atas untuk menyelesaikan posting asli berguna untuk server (cert klien ditambahkan ke server trust_store). Bersulang.

Penyiapan proyek Eclipse:

  • Proyek MyClient
  • src
  • uji
  • Perpustakaan Sistem JRE
  • ...
  • trust_store
    --- cacerts.jks --- keystore.jks

Cuplikan dari file 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");
        }

  });
}
Steve T
sumber
1

Masalah saya adalah bahwa Broker Keamanan Akses Cloud, NetSkope, diinstal pada laptop pekerjaan saya melalui pembaruan perangkat lunak. Ini mengubah rantai sertifikat dan saya masih tidak dapat terhubung ke server melalui klien java saya setelah mengimpor seluruh rantai ke keystore cacerts saya. Saya menonaktifkan NetSkope dan berhasil terhubung.

gary69
sumber
1

Dalam kasus saya, saya menghadapi masalah karena dalam proses kucing jantan saya keystore tertentu diberikan menggunakan

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

Ketika saya mengimpor sertifikat ke cacert JRE / lib / security dan perubahannya tidak mencerminkan. Kemudian saya melakukan perintah di bawah ini di mana /tmp/cert1.test berisi sertifikat server target

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

Kami dapat memeriksa ulang apakah impor sertifikat berhasil

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

dan lihat apakah server taget Anda ditemukan terhadap alias rapidssl-myserver

Sanjay Bharwani
sumber
0

Periksa apakah file itu $JAVA_HOME/lib/security/cacertsada! Dalam kasus saya itu bukan file tetapi tautan ke /etc/ssl/certs/java/cacertsdan juga ini adalah tautan ke sendiri (APA ???) jadi karena itu JVM tidak dapat menemukan file.

Solusi: Salin file cacerts nyata ( Anda dapat melakukannya dari JDK lain ) ke /etc/ssl/certs/java/direktori dan itu akan menyelesaikan masalah Anda :)

0x7E1
sumber
memang JDK memelihara tautan dan mungkin untuk kompatibilitas dengan API yang lebih lama, SDK ... Saya berhasil melakukan hal yang sama ... Saya pindah dari JDK 8 ke JDK 10 dan menggunakan Docker jadi saya hanya perlu menyalin cacerts dari sebuah gambar ke yang lain ... Saya membuat tautan dan cara yang persis sama ...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

Katakanlah jika Anda menggunakan variabel classpath seperti $ {JAVA_HOME} di 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"/>

Pada sasaran, tambahkan variabel classpath. yaitu .., -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
jayakar jayaraman
sumber
1
Jalur kelas dan sertifikat tidak ada hubungannya dengan satu sama lain sama sekali.
Marquis of Lorne
1
Saya yakin Anda salah paham soal itu.
Dawood ibn Kareem