Saya menggunakan OkHttp3 untuk membangun API koneksi sederhana untuk aplikasi Java murni, dan saya mengalami masalah pembangunan yang tampaknya dipicu oleh fakta bahwa Square menggunakan nama paket yang sama untuk beberapa artefak ketergantungan.

Saya telah melihat beberapa T&J sebelumnya yang membahas dependensi Maven dan perpesanan dari Eclipse, tetapi semuanya menunjukkan bahwa build Maven atau Gradle masih berfungsi bahkan jika Eclipse memberi anotasi pada impor dengan kesalahan modul. Dalam hal ini pembangunan Gradle gagal segera setelah saya menambahkan ketergantungan dan tidak membuat perubahan lain.

Aplikasi ini adalah build modul Java 11 murni. Saya menggunakan Eclipse yang sangat baru dengan sifat Gradle sebagai IDE, tetapi saya rasa ini tidak terlalu relevan. Saya menggunakan OkHttp3 untuk mengubah titik akhir pribadi menjadi API, dan salah satu titik akhir tersebut memerlukan CookieJar. Berharap untuk hanya menggunakan implementasi default, saya menambahkan 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' sebagai dependensi dalam proyek yang telah menarik 'com.squareup.okhttp3:okhttp:3.14.9' sebagai dependensi transitif. Kedua kelas ini secara teknis menawarkan kelas menggunakan nama paket yang sama: "okhttp3".

Misalnya, yang saya lakukan hanyalah menghapus komentar pada baris ketergantungan yang terlihat dalam cuplikan ini dan menyimpan build.gradle:

dependencies {
    implementation ('com.squareup.retrofit2:retrofit:2.9.0')
    implementation ('com.squareup.retrofit2:converter-gson:2.9.0')
    implementation ('com.squareup.okhttp3:logging-interceptor:3.14.9')
//  implementation ('com.squareup.okhttp3:okhttp-urlconnection:3.14.9')

Segera setelah proyek disegarkan, saya mendapatkan anotasi di Eclipse untuk semua impor "okhttp3":

Paket okhttp3 dapat diakses dari lebih dari satu modul: okhttp3, okhttp3.logging, okhttp3.urlconnection

Hasil build yang bersih dalam:

$ ./gradlew clean build

[...]

> Task :compileJava FAILED
error: the unnamed module reads package okhttp3 from both okhttp3.urlconnection and okhttp3
error: module retrofit2.converter.gson reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
error: module retrofit2 reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
error: module org.apache.commons.io reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
error: module httpcore5 reads package okhttp3 from both okhttp3 and okhttp3.urlconnection
[...]

Saya rasa itu tidak penting, tetapi saya menggunakan pembungkus Gradle 5.6.4.

Semua perpustakaan OkHttp3, sejauh yang saya tahu, telah mengatur info modul yang cukup untuk memenuhi Java 9+. Hal-hal modul di Eclipse tampaknya puas dengan itu. Sepertinya baik Eclipse maupun Gradle tidak menyukai fakta bahwa dua dependensi berbeda mengiklankan paket Java mereka sebagai "okhttp3". Tampaknya bagi saya bahwa setiap proyek berbasis Gradle atau Maven yang menggunakan Java 9 atau lebih tinggi akan gagal dengan dependensi paket terpisah.

Berdasarkan beberapa saran yang saya baca di tempat lain, saya telah mencoba mengecualikan 'com.squareup.okhttp3:okhttp' dari semua dependensi yang menyertakannya secara transitif dan kemudian menariknya secara terpisah, tetapi ini tidak membantu (bukannya saya pikir akan, tapi saya mencoba hujan es apa pun pada saat ini).

Solusinya mencakup peretasan seperti menjatuhkan dua kelas Kotlin yang saya inginkan ke dalam proyek secara langsung dan mengganti nama paket dengan cara itu. Ini adalah peretasan yang mengerikan, dan mungkin bertentangan dengan lisensi perpustakaan. Saya juga dapat mengimplementasikan hal-hal cookie yang saya butuhkan secara langsung, tetapi saya malas (meskipun, tampaknya, saya ingin menghabiskan energi saya untuk memecahkan masalah ini daripada mengimplementasikan kelas cookie menggunakan antarmuka yang sudah saya miliki).

Saya merasa ini adalah bug dari Square dan bagaimana mereka mengemas perpustakaan/modul ini. Karena fokus mereka begitu banyak pada Android, mungkin saya satu-satunya yang menginginkan okhttp-urlconnection di Java 9 atau lebih tinggi? Jadi, Pertanyaan ini lebih tentang melihat apakah saya harus mengangkat ini sebagai cacat, dan juga mungkin saya telah mengabaikan sesuatu yang jelas.

2
clvrmnky 6 Juli 2020, 17:49

1 menjawab

Jawaban Terbaik

Ini kesalahan OkHttp dan kami dapat memperbaikinya untuk Anda. Harap buka bug pelacakan dengan tautan ke masalah ini.

Kami akan memindahkan kedua kelas tersebut ke paket baru. Untuk kompatibel ke belakang, kami juga harus meninggalkan implementasi pendelegasian. Semoga alat mengizinkan ini!

Sayang sekali JPMS memiliki kendala ini. Kami telah memperbaiki beberapa proyek sumber terbuka kami yang lain tetapi tidak memperbaiki yang ini.

1
Jesse Wilson 6 Juli 2020, 23:24