JavaRush /Blog Jawa /Random-JV /Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa c...
Viacheslav
tingkat

Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya)

Diterbitake ing grup
"Aja reinvent setir" iku salah siji saka aturan utama kanggo karya sukses lan efisien. Nanging apa sing kudu dilakoni nalika sampeyan ora pengin reinvent setir dhewe, nanging setir wong liya dadi bengkong lan gembong kothak? Tinjauan iki dimaksudake kanggo nyedhiyakake introduksi kanthi ringkes babagan teknik ndandani perpustakaan wong liya "minangka pilihan pungkasan" lan carane nggedhekake iki menyang komputer.
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 1

Pambuka

Kita kabeh nggunakake siji alat utawa liyane. Nanging kadhangkala alat kasebut ora cocog utawa duwe kesalahan. Kanthi fitur basa Jawa, kita bisa mbenerake prilaku piranti ing ngendi kita butuh. Iku apik yen kita nyumbang kanggo proyek lan ngirim panjalukan narik (sampeyan bisa maca liyane kene: " GitHub - Kontribusi kanggo proyek "). Nanging bisa uga ora langsung ditampa, utawa malah ora ditampa. Nanging kanggo kabutuhan proyek iku perlu saiki. Lan ing kene, muga-muga artikel iki bakal nuduhake alat sing kasedhiya kanggo kita minangka pangembang. Kita kudu nindakake langkah-langkah ing ngisor iki sing bakal kita ucapake:
  • Siapke aplikasi tes contone (nggunakake conto proyek Hibernate)
  • Nemokake lokasi sing bisa diganti
  • Nggawe owah-owahan
  • Nyebarake repositori
Kabeh langkah ing ngisor iki diwenehi kanggo OS Windows, nanging duwe analog kanggo sistem nix. Supaya sampeyan bisa mbaleni maneh yen perlu.

Persiapan Mata Pelajaran

Dadi, kita butuh proyek uji coba. Hibernate cocog kanggo kita, amarga ... iku "gaya, modis, modern." Aku ora bakal rinci banget, amarga ... Artikel kasebut dudu babagan Hibernate. Kita bakal nindakake kabeh kanthi cepet lan menyang titik. Lan kita, kaya pangembang sing tepat, bakal nggunakake sistem mbangun. Contone, Gradle uga cocok kanggo kita, sing kudu diinstal kanggo artikel iki ( https://gradle.org/install/ ). Kaping pisanan, kita kudu nggawe proyek. Maven duwe archetypes kanggo iki , lan Gradle duwe plugin khusus kanggo iki: Gradle Init . Dadi, bukak baris perintah kanthi cara sing sampeyan kenal. Gawe direktori kanggo proyek kasebut, pindhah menyang lan jalanake perintah kasebut:

mkdir javarush 
cd javarush 
gradle init --type java-application
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 2
Sadurunge ngimpor proyek, ayo gawe sawetara owah-owahan menyang file sing nerangake carane mbangun. Berkas iki diarani skrip mbangun lan dijenengi build.gradle. Dumunung ing direktori sing dieksekusi gradle init. Mulane, kita mung mbukak (contone, ing Windows karo printah wiwitan build.gradle). Kita nemokake blok " dependensi " ing kana, yaiku. ketergantungan. Kabeh kendi pihak katelu sing bakal digunakake diterangake ing kene. Saiki kita kudu ngerti apa sing bakal diterangake ing kene. Ayo menyang situs web Hibernate ( http://hibernate.org/ ). Kita kasengsem ing ORM Hibernate . We kudu release paling anyar. Ing menu ing sisih kiwa ana bagean "Rilis". Pilih "latest stable". Gulung mudhun lan temokake "Implementasi inti (kalebu JPA)". Sadurunge, sampeyan kudu nyambungake dhukungan JPA kanthi kapisah, nanging saiki kabeh wis dadi luwih gampang lan mung siji ketergantungan sing cukup. Kita uga kudu nggarap database nggunakake Hibernate. Kanggo nindakake iki, ayo njupuk pilihan sing paling gampang - H2 Database . Pilihan wis digawe, kene dependensi kita:

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'
}
Apik, apa sabanjure? Kita kudu ngatur Hibernate. Hibernate duwe " Pandhuan Miwiti ", nanging bodho lan luwih alangan tinimbang bantuan. Mula, ayo langsung menyang " Pandhuan pangguna " kaya wong sing bener. Ing tabel isi kita ndeleng bagean " Bootstrap ", sing nerjemahake minangka "Bootstrapping". Mung apa sing perlu. Ana akeh tembung pinter ditulis ana, nanging titik iku kudu ana direktori META-INF ing classpath, lan kudu ana file persistence.xml. Miturut standar, classpath ngemot direktori "sumber daya". Mulane, kita nggawe direktori sing ditemtokake: mkdir src\main\resources\META-INF Nggawe file persistence.xml ing kana lan mbukak. Ana ing dokumentasi ana conto "Conto 268. META-INF/persistence.xml file konfigurasi" saka ngendi kita bakal njupuk isi lan masang menyang file persistence.xml. Sabanjure, bukak IDE lan ngimpor proyek sing digawe. Saiki kita kudu nyimpen soko menyang database. Iki sing diarani entitas. Entitas makili soko saka model domain sing disebut. Lan ing daftar isi, lah, kita ndeleng " 2. Model Domain ". Kita mudhun teks lan ndeleng ing bab "2.1. Jinis pemetaan "conto prasaja saka entitas. Ayo dadi njupuk kanggo awake dhewe, shortened sethitik:
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;
    }
}
Saiki kita duwe kelas sing makili entitas. Ayo bali menyang persistence.xml lan mbenerake siji panggonan ing kono: Ing ngendi dituduhake, classkita bakal nuduhake kelas kita entity.Contact. Apik, sing isih ana yaiku diluncurake. Ayo bali menyang bab Bootstrap . Awit kita ora duwe server aplikasi sing bakal nyedhiyani kita karo lingkungan EE khusus (i.e., lingkungan sing ngleksanakake prilaku sistem tartamtu kanggo kita), kita bisa ing lingkungan SE. Kanggo iki, mung conto "Conto 269. Aplikasi bootstrapped EntityManagerFactory" cocok kanggo kita. Contone, ayo nglakoni:
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);
    }
}
Hurray, topik kita wis siyap. Aku ora pengin ngilangi bagean iki , amarga ... Kanggo bab-bab ing ngisor iki, luwih becik dimangerteni kepiye topik kita dadi.

Nemokake Prilaku sing Bisa Diowahi

Ayo dadi njupuk Panggonan initialization saka lapangan count saka jinis BigInteger lan nyetel breakpoints ana ( BreakPoint ). Sawise dilebokake ing baris sing dikarepake, iki bisa ditindakake kanthi nggunakake Ctrl + F8 utawa liwat menu Run -> Toggle Line Breakpoint. Banjur kita mbukak metode utama ing debug (Run -> Debug):
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 3
Conto sing rada kikuk, nanging ayo ngomong yen kita pengin ngganti jumlah spasi pitakon nalika wiwitan. Minangka kita bisa ndeleng, sqlQuery kita NativeQueryImpl. Klik Ctrl+N, tulis jeneng kelas, banjur pindhah menyang. Dadi yen kita mlebu kelas, kita bakal ditransfer menyang papan panggonan kelas iki lan nguripake autoscroll:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 4
Ayo kita langsung Wigati sing Idea saiki ora ngerti ngendi kanggo nemokake kode sumber program (kode sumber, iku). Mula, dheweke kanthi apik nyimpulake konten saka file kelas kanggo kita:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 5
Elinga uga ing judhul jendhela IntelliJ Idea ditulis ing ngendi Gradle nyimpen artefak kanggo kita. Saiki, ayo pindhah menyang Idea path ing ngendi artefak kita dumunung:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 6
Ayo menyang direktori iki ing baris printah nggunakake printah cd way to каталогу. Aku bakal nggawe cathetan langsung: yen bisa mbangun proyek saka sumber, luwih apik kanggo mbangun saka sumber. Contone, kode sumber Hibernate kasedhiya ing situs web resmi. Iku luwih apik kanggo Pick munggah kanggo versi sing dikarepake lan nggawe kabeh owah-owahan ana lan ngumpul nggunakake script mbangun sing kasebut ing project. Aku saiki ing artikel pilihan paling elek - ana jar, nanging ora kode sumber. Lan cathetan nomer 2: Gradle bisa entuk kode sumber nggunakake plugin. Waca Cara ndownload javadocs lan sumber kanggo jar nggunakake Gradle kanggo rincian .

Nggawe owah-owahan

Kita kudu nggawe maneh struktur direktori sesuai karo paket ing ngendi kelas sing diganti. Ing kasus iki: mkdir org\hibernate\query\internal, banjur kita nggawe file ing direktori iki NativeQueryImpl.java. Saiki kita mbukak file iki lan nyalin kabeh isi kelas saka IDE ana (sing padha Idea decompiled kanggo kita). Ngganti garis sing dibutuhake. Tuladhane:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 7
Saiki, ayo ngumpulake file kasebut. Kita nindakake: javac org\hibernate\query\internal\NativeQueryImpl.java. Wow, sampeyan ora bisa mung njupuk lan ngumpulake tanpa kesalahan. Kita nampa akeh kesalahan Ora Bisa Nemokake Simbol, amarga ... kelas mutable disambungake menyang kelas liyane, kang IntelliJ Idea biasane nambah kanggo classpath kanggo kita. Apa sampeyan rumangsa kabeh migunani saka IDE kita? =) Lha nek di tambahi dewe yo iso. Ayo nyalin path kanggo:
  • [1] - hibernate-inti-5.2.17.Final.jar
  • [2] - hibernate-jpa-2.1-api-1.0.0.Final.jar
Kaya sing ditindakake: Ing tampilan "Proyek" ing "Perpustakaan eksternal" kita nemokake jar sing dibutuhake lan klik Ctrl+Shift+C. Saiki ayo nggawe lan nglakokake perintah ing ngisor iki: javac -cp [1];[2] org\hibernate\query\internal\NativeQueryImpl.java Akibaté, file kelas anyar bakal katon ing jejere file java, sing kudu dianyari ing file jar:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 8
Hore, saiki sampeyan bisa nindakake nganyari jar. Kita bisa dipandu dening bahan resmi : jar uf hibernate-core-5.2.17.Final.jar org\hibernate\query\internal\*.class Open IntelliJ Idea kemungkinan besar ora ngidini sampeyan ngganti file. Mulane, sadurunge nindakake nganyari jar, sampeyan bakal paling kamungkinan kanggo nutup Idea, lan sawise nganyari, mbukak. Sawise iki, sampeyan bisa mbukak maneh IDE lan mbukak dubug maneh. Break Points ora ngreset antarane IDE wiwit maneh. Mulane, eksekusi program bakal mandheg ing ngendi sadurunge. Voila, kita ndeleng kepiye owah-owahan bisa ditindakake:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 9
Agung. Nanging ing kene pitakonan muncul - amarga apa? Mung amarga kasunyatan manawa nalika gradle nggawe proyek, analisa dependensi lan blok repositori. Gradle nduweni cache mbangun tartamtu, sing dumunung ing lokasi tartamtu (pirsani " Carane nyetel lokasi cache gradle? " Yen ora ana ketergantungan ing cache, banjur Gradle bakal ngundhuh saka gudang. Wiwit kita ngganti jar ing cache dhewe, banjur Gradle mikir sing perpustakaan ana ing cache lan ora pump metu apa-apa. Nanging sembarang ngresiki cache bakal mimpin kanggo owah-owahan kita ilang. Kajaba iku, ora ana siji nanging kita mung bisa njaluk. , opo ora? Apa sing kudu dilakoni. Hmm, download saka gudang? Dadi kita butuh gudang kita, kanthi preferensi lan pujangga. Iki langkah sabanjure.

Nyebarake repositori

Ana macem-macem solusi gratis kanggo nyebarake repositori sampeyan: salah sijine yaiku Artifactory , lan liyane yaiku Apache Archive . Artifactory katon modis, apik gayane, modern, nanging aku duwe kesulitan, aku ora pengin nyelehake artefak kanthi bener lan nggawe metadata maven sing salah. Mulane, ora sengaja kanggo aku, versi Apache bisa digunakake kanggo aku. Ternyata ora ayu, nanging bisa dipercaya. Ing kaca download , goleki versi Standalone lan unpack. Dheweke duwe " Mulai Cepet " dhewe . Sawise diluncurake, sampeyan kudu ngenteni nganti alamat http://127.0.0.1:8080/#repositorylist. Sawise iku, pilih "Upload Artefact":
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 10
Klik "Mulai Upload", banjur "Simpen File". Sawise iki, pesen sukses ijo bakal katon lan artefak bakal kasedhiya ing bagean "Browse". Iki kudu ditindakake kanggo file jar lan pom:
Ide IntelliJ: Dekompilasi, Kompilasi, Substitusi (utawa carane mbenerake kesalahane wong liya) - 11
Iki amarga kasunyatan manawa dependensi hibernate tambahan ditemtokake ing file pom. Lan kita mung duwe 1 langkah kiwa - nemtokake repositori ing skrip mbangun kita:

repositories {
    jcenter()
    maven {
        url "http://127.0.0.1:8080/repository/internal/"
    }
}
Lan, miturut, versi hibernate kita bakal dadi: compile 'org.hibernate:hibernate-core:5.2.17.Final-JAVARUSH'. Iku kabeh, saiki proyek kita nggunakake versi sing didandani, lan dudu versi asli.

Kesimpulan

Kayane kita wis kenalan. Mugi iku menarik. "Trik" kasebut arang banget ditindakake, nanging yen dumadakan syarat bisnis sampeyan nyetel kahanan sing ora bisa ditindakake dening perpustakaan sing sampeyan gunakake, sampeyan ngerti apa sing kudu ditindakake. Lan ya, ana sawetara conto sing bisa didandani kanthi cara iki:
  • Ana server web sing diarani Undertow. Nganti sawetara wektu, ana bug sing, nalika nggunakake proxy, ora ngidini kita nemokake IP pangguna pungkasan.
  • Kanggo wektu iki, WildFly JPA ditangani kanthi cara tartamtu siji wayahe ora dijupuk menyang akun dening specification, amarga iki Pangecualian padha di buwang. Lan ora bisa dikonfigurasi.
#Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION