JavaRush /Blog Java /Random-MS /Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau ...

Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain)

Diterbitkan dalam kumpulan
"Jangan cipta semula roda" adalah salah satu peraturan utama untuk kerja yang berjaya dan cekap. Tetapi apa yang perlu dilakukan apabila anda tidak mahu mencipta semula roda anda sendiri, tetapi stereng orang lain ternyata bengkok dan rodanya empat segi? Semakan ini bertujuan untuk memberikan pengenalan ringkas yang mungkin kepada teknik membetulkan perpustakaan orang lain "sebagai pilihan terakhir" dan cara memanjangkannya ke komputer anda.
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 1

pengenalan

Kita semua menggunakan satu alat atau yang lain. Tetapi kadangkala alat itu tidak sesuai sepenuhnya atau mempunyai ralat. Terima kasih kepada ciri-ciri bahasa Java, kami boleh membetulkan tingkah laku alatan di mana kami memerlukannya. Adalah baik apabila kami menyumbang kepada projek dan menghantar permintaan tarik (anda boleh membaca lebih lanjut di sini: " GitHub - Menyumbang kepada projek "). Tetapi mereka mungkin tidak diterima serta-merta, atau mungkin tidak diterima. Tetapi untuk keperluan projek itu perlu sekarang. Dan di sini, saya harap, artikel ini akan menunjukkan alat yang tersedia untuk kami sebagai pembangun. Kami perlu melakukan langkah-langkah berikut yang akan kami bincangkan:
  • Sediakan aplikasi ujian contohnya (menggunakan contoh projek Hibernate)
  • Mencari lokasi yang boleh diubah
  • Membuat perubahan
  • Menyebarkan repositori
Semua langkah di bawah diberikan untuk OS Windows, tetapi mempunyai analog untuk sistem nix. Jadi anda boleh mengulanginya jika perlu.

Penyediaan Mata Pelajaran

Jadi, kami memerlukan projek ujian. Hibernate sesuai untuk kita, kerana... ia "bergaya, bergaya, moden." Saya tidak akan menjelaskan secara terperinci, kerana... Artikel itu bukan mengenai Hibernate. Kami akan melakukan segala-galanya dengan cepat dan tepat. Dan kami, seperti pembangun yang betul, akan menggunakan sistem binaan. Sebagai contoh, Gradle juga sesuai untuk kami, yang mesti dipasang untuk artikel ini ( https://gradle.org/install/ ). Pertama, kita perlu membuat projek. Maven mempunyai archetypes untuk ini dan Gradle mempunyai pemalam khas untuk ini: Gradle Init . Jadi, buka baris arahan dalam apa jua cara yang anda ketahui. Buat direktori untuk projek itu, pergi ke sana dan laksanakan arahan:

mkdir javarush 
cd javarush 
gradle init --type java-application
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 2
Sebelum mengimport projek, mari buat beberapa perubahan pada fail yang menerangkan cara membina. Fail ini dipanggil skrip bina dan dinamakan build.gradle. Ia terletak dalam direktori di mana kami melaksanakan gradle init. Oleh itu, kami hanya membukanya (contohnya, dalam Windows dengan arahan mula build.gradle). Kami mendapati blok " dependensi " di sana, i.e. kebergantungan. Semua balang pihak ketiga yang akan kami gunakan diterangkan di sini. Sekarang kita perlu memahami apa yang hendak diterangkan di sini. Mari pergi ke laman web Hibernate ( http://hibernate.org/ ). Kami berminat dengan ORM Hibernate . Kami memerlukan keluaran terbaru. Dalam menu di sebelah kiri terdapat subseksyen "Keluaran". Pilih "stabil terkini". Tatal ke bawah dan cari "Pelaksanaan teras (termasuk JPA)". Sebelum ini, adalah perlu untuk menyambung sokongan JPA secara berasingan, tetapi kini segala-galanya menjadi lebih mudah dan hanya satu kebergantungan sudah mencukupi. Kami juga perlu bekerja dengan pangkalan data menggunakan Hibernate. Untuk melakukan ini, mari kita ambil pilihan paling mudah - Pangkalan Data H2 . Pilihan telah dibuat, berikut adalah kebergantungan kami:

dependencies {
    // Базовая зависимость для Hibernate (новые версии включают и JPA)
    compile 'org.hibernate:hibernate-core:5.2.17.Final'
    // База данных, к которой мы будем подключаться
    compile 'com.h2database:h2:1.4.197'
    // Use JUnit test framework
    testCompile 'junit:junit:4.12'
}
Hebat, apa yang seterusnya? Kita perlu mengkonfigurasi Hibernate. Hibernate mempunyai " Panduan Bermula ", tetapi ia adalah bodoh dan lebih merupakan penghalang daripada bantuan. Oleh itu, mari pergi terus ke " Panduan Pengguna " seperti orang yang betul. Dalam jadual kandungan kita melihat bahagian " Bootstrap ", yang diterjemahkan sebagai "Bootstrapping". Hanya apa yang anda perlukan. Terdapat banyak perkataan pintar yang ditulis di sana, tetapi maksudnya ialah perlu ada direktori META-INF pada classpath dan mesti ada fail persistence.xml. Mengikut standard, classpath mengandungi direktori "sumber". Oleh itu, kami mencipta direktori yang ditentukan: mkdir src\main\resources\META-INF Cipta fail persistence.xml di sana dan bukanya. Terdapat dalam dokumentasi terdapat contoh "Contoh 268. fail konfigurasi META-INF/persistence.xml" dari mana kami akan mengambil kandungan dan memasukkannya ke dalam fail persistence.xml. Seterusnya, lancarkan IDE dan import projek kami yang dibuat ke dalamnya. Sekarang kita perlu menyimpan sesuatu ke pangkalan data. Ini adalah sesuatu yang dipanggil entiti. Entiti mewakili sesuatu daripada model domain yang dipanggil. Dan dalam jadual kandungan, lihat dan lihat, kita lihat " 2. Model Domain ". Kami turun teks dan lihat dalam bab "2.1. Jenis pemetaan" contoh mudah entiti. Mari kita ambil sendiri, pendekkan sedikit:
package entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity(name = "Contact")
public class Contact {

    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    public Contact(String name) {
        this.name = name;
    }
}
Sekarang kita mempunyai kelas yang mewakili entiti. Mari kembali ke persistence.xml dan betulkan satu tempat di sana: Di mana ditunjukkan, classkami akan menunjukkan kelas kami entity.Contact. Hebat, yang tinggal hanyalah untuk dilancarkan. Mari kembali ke bab Bootstrap . Memandangkan kami tidak mempunyai pelayan aplikasi yang akan memberikan kami persekitaran EE khas (iaitu, persekitaran yang melaksanakan gelagat sistem tertentu untuk kami), kami bekerja dalam persekitaran SE. Untuk ini, hanya contoh "Contoh 269. Application bootstrapped EntityManagerFactory" sesuai untuk kami. Sebagai contoh, mari kita lakukan ini:
public class App {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("CRM");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        Contact contact = new Contact("Vasya");
        em.persist(contact);
        em.getTransaction().commit();
        Query sqlQuery = em.createNativeQuery("select count(*) from contact");
        BigInteger count = (BigInteger) sqlQuery.getSingleResult();
        emf.close();
        System.out.println("Entiries count: " + count);
    }
}
Hore, subjek kita sudah siap. Saya tidak mahu meninggalkan bahagian ini , kerana... Untuk bab-bab berikutnya, adalah dinasihatkan untuk memahami bagaimana subjek kami muncul.

Mencari Tingkah Laku yang Boleh Diubah Suai

Mari kita ambil tempat permulaan medan kiraan jenis BigInteger dan tetapkan titik putus di sana ( BreakPoint ). Setelah memasukkan pada baris yang dikehendaki, ini boleh dilakukan menggunakan Ctrl+F8 atau melalui menu Run -> Toggle Line Breakpoint. Kemudian kami menjalankan kaedah utama kami dalam debug (Run -> Debug):
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 3
Sedikit contoh yang kekok, tetapi katakan kita mahu menukar bilangan ruang pertanyaan semasa permulaan. Seperti yang kita dapat lihat, sqlQuery kami ialah NativeQueryImpl. Klik Ctrl+N, tulis nama kelas dan pergi ke kelas itu. Supaya apabila kita pergi ke kelas, kita akan dipindahkan ke tempat di mana kelas ini terletak dan hidupkan autoscroll:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 4
Marilah kita segera ambil perhatian bahawa Idea pada masa ini tidak tahu di mana untuk mencari kod sumber program (kod sumber, iaitu). Oleh itu, dia dengan hormatnya menyahkompilasi kandungan daripada fail kelas untuk kami:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 5
Perhatikan juga bahawa dalam tajuk tetingkap IntelliJ Idea ia ditulis di mana Gradle menyimpan artifak untuk kita. Sekarang, mari kita masuk ke Idea laluan di mana artifak kita berada:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 6
Mari pergi ke direktori ini pada baris arahan menggunakan arahan cd way to каталогу. Saya akan membuat nota dengan segera: jika boleh membina projek daripada sumber, lebih baik membina daripada sumber. Sebagai contoh, kod sumber Hibernate tersedia di tapak web rasmi. Adalah lebih baik untuk mengambilnya untuk versi yang dikehendaki dan membuat semua perubahan di sana dan memasang menggunakan skrip binaan yang dinyatakan dalam projek. Saya membentangkan dalam artikel pilihan yang paling dahsyat - terdapat balang, tetapi tiada kod sumber. Dan nota nombor 2: Gradle boleh mendapatkan kod sumber menggunakan pemalam. Lihat Cara memuat turun javadocs dan sumber untuk balang menggunakan Gradle untuk mendapatkan butiran .

Membuat perubahan

Kita perlu mencipta semula struktur direktori mengikut pakej kelas yang kita ubah berada. Dalam kes ini: mkdir org\hibernate\query\internal, selepas itu kami mencipta fail dalam direktori ini NativeQueryImpl.java. Sekarang kami membuka fail ini dan menyalin semua kandungan kelas dari IDE di sana (yang sama yang Idea decompiled untuk kami). Tukar baris yang diperlukan. Sebagai contoh:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 7
Sekarang, mari kita susun fail. Kami buat: javac org\hibernate\query\internal\NativeQueryImpl.java. Wah, anda tidak boleh mengambilnya dan menyusunnya tanpa ralat. Kami menerima banyak ralat Cannot Find Symbol, kerana... kelas boleh ubah terikat dengan kelas lain, yang IntelliJ Idea biasanya menambah pada laluan kelas untuk kita. Adakah anda merasakan semua kegunaan IDE kami? =) Nah, kita tambah sendiri, kita pun boleh buat. Mari salin laluan untuk:
  • [1] - hibernate-core-5.2.17.Final.jar
  • [2] - hibernate-jpa-2.1-api-1.0.0.Final.jar
Sama seperti yang kami lakukan: Dalam paparan "Projek" dalam "Perpustakaan luaran" kami menemui balang yang diperlukan dan klik Ctrl+Shift+C. Sekarang mari buat dan laksanakan arahan berikut: javac -cp [1];[2] org\hibernate\query\internal\NativeQueryImpl.java Akibatnya, fail kelas baharu akan muncul di sebelah fail java, yang perlu dikemas kini dalam fail jar:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 8
Hore, kini anda boleh melakukan kemas kini balang. Kami boleh dibimbing oleh bahan rasmi : jar uf hibernate-core-5.2.17.Final.jar org\hibernate\query\internal\*.class Open IntelliJ Idea kemungkinan besar tidak akan membenarkan anda menukar fail. Oleh itu, sebelum melakukan kemas kini balang, kemungkinan besar anda perlu menutup Idea, dan selepas kemas kini, bukanya. Selepas ini, anda boleh membuka semula IDE dan menjalankan dubug semula. Mata Pecah tidak ditetapkan semula antara permulaan semula IDE. Oleh itu, pelaksanaan program akan berhenti di tempat sebelumnya. Voila, kami melihat cara perubahan kami berfungsi:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 9
Hebat. Tetapi di sini timbul persoalan - kerana apa? Hanya disebabkan oleh fakta bahawa apabila gradle membina projek, ia menganalisis kebergantungan dan blok repositori. Gradle mempunyai cache binaan tertentu, yang terletak di lokasi tertentu (lihat " Bagaimana untuk menetapkan lokasi cache gradle? " Jika tiada pergantungan dalam cache, maka Gradle akan memuat turunnya dari repositori. Memandangkan kami menukar balang dalam cache itu sendiri, kemudian Gradle berpendapat bahawa perpustakaan itu berada dalam cache dan tidak mengepam keluar apa-apa. Tetapi sebarang pembersihan cache akan menyebabkan perubahan kami hilang. Selain itu, tiada siapa selain kami boleh pergi dan mendapatkannya. Betapa banyak kesulitan , bukan? Apa yang perlu dilakukan. Hmm, muat turun dari repositori? Jadi kita memerlukan repositori kita, dengan pilihan dan penyair. Ini adalah langkah seterusnya.

Menyebarkan repositori

Terdapat penyelesaian percuma yang berbeza untuk menggunakan repositori anda: salah satunya ialah Artifactory , dan yang lain ialah Apache Archive . Artifactory kelihatan bergaya, bergaya, moden, tetapi saya menghadapi kesukaran dengannya, saya tidak mahu meletakkan artifak dengan betul dan menghasilkan metadata maven yang salah. Oleh itu, tanpa diduga untuk diri saya sendiri, versi Apache berfungsi untuk saya. Ia ternyata tidak begitu cantik, tetapi ia berfungsi dengan pasti. Pada halaman muat turun , cari versi Kendiri dan buka bungkusannya. Mereka mempunyai " Permulaan Pantas " mereka sendiri . Selepas pelancaran, anda perlu menunggu sehingga alamat http://127.0.0.1:8080/#repositorylist. Selepas itu, pilih "Muat naik Artifak":
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 10
Klik "Mula Muat Naik", dan kemudian "Simpan Fail". Selepas ini, mesej kejayaan hijau akan muncul dan artifak akan tersedia dalam bahagian "Semak imbas". Ini perlu dilakukan untuk fail jar dan pom:
Idea IntelliJ: Penyusunan, Penyusunan, Penggantian (atau cara membetulkan kesilapan orang lain) - 11
Ini disebabkan oleh fakta bahawa kebergantungan hibernate tambahan ditentukan dalam fail pom. Dan kami hanya mempunyai 1 langkah lagi - nyatakan repositori dalam skrip binaan kami:

repositories {
    jcenter()
    maven {
        url "http://127.0.0.1:8080/repository/internal/"
    }
}
Dan, oleh itu, versi hibernate kami akan menjadi: compile 'org.hibernate:hibernate-core:5.2.17.Final-JAVARUSH'. Itu sahaja, kini projek kami menggunakan versi yang kami betulkan, dan bukan versi asal.

Kesimpulan

Nampaknya kita sudah berkenalan. Saya harap ia menarik. "Helah" sedemikian jarang dilakukan, tetapi jika tiba-tiba keperluan perniagaan anda menetapkan syarat yang tidak dapat dipenuhi oleh perpustakaan yang anda gunakan, anda tahu apa yang perlu dilakukan. Dan ya, berikut adalah beberapa contoh yang boleh diperbetulkan dengan cara ini:
  • Terdapat pelayan web yang dipanggil Undertow. Sehingga suatu ketika, terdapat pepijat yang, apabila menggunakan proksi, tidak membenarkan kami mengetahui IP pengguna akhir.
  • Buat masa ini, WildFly JPA mengendalikan dengan cara tertentu satu saat yang tidak diambil kira oleh spesifikasi, kerana Pengecualian ini dilemparkan. Dan ia tidak boleh dikonfigurasikan.
#Viacheslav
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION