JavaRush /Java блогы /Random-KK /IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немес...
Viacheslav
Деңгей

IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады)

Топта жарияланған
«Дөңгелекті қайта ойлап таппа» - бұл табысты және тиімді жұмыстың негізгі ережелерінің бірі. Бірақ сіз өз дөңгелегін ойлап тапқыңыз келмесе, бірақ біреудің рульі қисық болып, дөңгелектері төртбұрышты болып шықса не істеу керек? Бұл шолу мүмкіндігінше басқа адамдардың кітапханаларын «соңғы шара ретінде» түзету әдістемесіне және бұл мәселені сіздің компьютеріңізден тыс кеңейтуге мүмкіндігінше қысқаша кіріспе беруге арналған.
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 1

Кіріспе

Біз бәріміз бір немесе басқа құралды қолданамыз. Бірақ кейде құралдар толығымен сәйкес келмейді немесе қателер болады. Java тілінің мүмкіндіктерінің арқасында біз қажетті жерде құралдардың әрекетін түзете аламыз. Біз жобаларға үлес қосып, тарту сұрауларын жібергеніміз жақсы (толығырақ мына жерден оқи аласыз: “ GitHub – Жобаларға үлес қосу ”). Бірақ олар бірден қабылданбауы мүмкін немесе тіпті қабылданбауы мүмкін. Бірақ жобаның қажеттіліктері үшін бұл қазір қажет. Міне, бұл мақала әзірлеушілер ретінде бізге қол жетімді құралдарды көрсетеді деп үміттенемін. Біз сөйлесетін келесі қадамдарды орындауымыз керек:
  • Сынақ қолданбасын дайындаңыз (мысалы, Hibernate жобасының мысалын пайдалана отырып)
  • Өзгермелі орынды табу
  • Өзгеріс жасау
  • Репозиторийді қолдану
Төмендегі барлық қадамдар Windows ОЖ үшін берілген, бірақ nix жүйелері үшін аналогтары бар. Сондықтан қажет болған жағдайда оларды қайталауға болады.

Тақырыпты дайындау

Сонымен, бізге сынақ жобасы қажет. Күту күйі біз үшін өте қолайлы, себебі... бұл «сәнді, сәнді, заманауи». Мен тым көп егжей-тегжейге тоқталмаймын, өйткені ... Мақала күту күйі туралы емес. Біз бәрін тез және дәл орындаймыз. Біз, дұрыс әзірлеушілер сияқты, құрастыру жүйесін қолданамыз. Мысалы, Gradle біз үшін де қолайлы, ол осы мақала үшін орнатылуы керек ( https://gradle.org/install/ ). Біріншіден, біз жобаны жасауымыз керек. Maven-де бұл үшін архетиптер бар және Gradle-де бұл үшін арнайы плагин бар: Gradle Init . Сонымен, пәрмен жолын өзіңізге белгілі кез келген жолмен ашыңыз. Жоба үшін каталог жасаңыз, оған өтіп, пәрменді орындаңыз:

mkdir javarush 
cd javarush 
gradle init --type java-application
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 2
Жобаны импорттамас бұрын, құру жолын сипаттайтын файлға кейбір өзгерістер енгізейік. Бұл файл құрастыру сценарийі деп аталады және build.gradle деп аталады. Ол gradle init орындаған каталогта орналасқан. Сондықтан біз оны жай ғана ашамыз (мысалы, Windows жүйесінде start build.gradle пәрменімен). Біз ол жерден « тәуелділіктер » блогын табамыз, яғни. тәуелділіктер. Біз қолданатын барлық үшінші тарап банкалары осы жерде сипатталған. Енді біз мұнда не сипаттау керектігін түсінуіміз керек. Күту веб-сайтына барайық ( http://hibernate.org/ ). Бізді Hibernate ORM қызықтырады . Бізге соңғы шығарылым қажет. Сол жақтағы мәзірде «Шығарылымдар» бөлімі бар. «Соңғы тұрақты» таңдаңыз. Төмен жылжып, «Негізгі іске асыру (JPA кіреді)» табыңыз. Бұрын JPA қолдауын бөлек қосу қажет болды, бірақ қазір бәрі қарапайым болды және бір ғана тәуелділік жеткілікті. Сондай-ақ біз күту режимін пайдаланып дерекқормен жұмыс істеуіміз керек. Мұны істеу үшін ең қарапайым опцияны алайық - H2 Database . Таңдау жасалды, міне, біздің тәуелділіктеріміз:

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'
}
Керемет, әрі қарай не болады? Біз күту күйін конфигурациялауымыз керек. Күту күйінде " Жұмысты бастау нұсқаулығы " бар, бірақ ол ақымақ және көмектен гөрі кедергі. Сондықтан, дұрыс адамдар сияқты тікелей « Пайдаланушы нұсқаулығына » барайық . Мазмұн кестесінде біз « Bootstrap » бөлімін көреміз, ол «Bootstrapping» деп аударылады. Сізге қажет нәрсе. Онда көптеген ақылды сөздер жазылған, бірақ мәселе сынып жолында META-INF каталогы болуы керек және persistence.xml файлы болуы керек. Стандартқа сәйкес сынып жолында «ресурстар» каталогы бар. Сондықтан біз көрсетілген каталогты жасаймыз: mkdir src\main\resources\META-INF Онда persistence.xml файлын жасаңыз және оны ашыңыз. Құжаттамада «268-мысал. META-INF/persistence.xml конфигурация файлы» мысалы бар, оның мазмұнын алып, оны persistence.xml файлына кірістіреміз. Содан кейін IDE іске қосыңыз және оған біздің құрылған жобамызды импорттаңыз. Енді дерекқорға бір нәрсені сақтау керек. Бұл субъект деп аталатын нәрсе. Нысандар домен үлгісі деп аталатын нәрсені білдіреді. Мазмұн кестесінде, міне, біз « 2. Домен моделін » көреміз. Біз мәтінді төмен түсіреміз және «2.1. Карталау түрлері» тарауында нысанның қарапайым мысалын көреміз. Оны аздап қысқартып, өзімізге алайық:
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;
    }
}
Енді бізде нысанды көрсететін класс бар. Persistence.xml сайтына оралайық және сол жерде бір орынды түзетейік: Көрсетілген жерде classбіз өз сыныбымызды көрсетеміз entity.Contact. Керемет, тек іске қосу ғана қалды. Bootstrap тарауына оралайық . Бізде арнайы EE ортасын (яғни, біз үшін белгілі бір жүйе әрекетін жүзеге асыратын орта) қамтамасыз ететін қолданба serverі болмағандықтан, біз SE ортасында жұмыс істейміз. Бұл үшін бізге тек «Мысал 269. Бағдарлама жүктелген EntityManagerFactory» мысалы қолайлы. Мысалы, мұны істейік:
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);
    }
}
Ура, тақырыбымыз дайын. Мен бұл бөлімді қалдырғым келмеді , өйткені... Келесі тараулар үшін тақырыбымыздың қалай пайда болғанын түсінген жөн.

Өзгертілетін мінез-құлықты табу

BigInteger типті санау өрісін инициализациялау орнын алайық және сонда тоқтау нүктелерін орнатайық ( BreakPoint ). Қажетті жолға кірістіргеннен кейін, мұны Ctrl+F8 немесе Run -> Toggle Line Breakpoint мәзірі арқылы жасауға болады. Содан кейін біз негізгі әдісімізді отладта (Run -> Debug) іске қосамыз:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 3
Біраз ыңғайсыз мысал, бірақ іске қосу кезінде сұрау кеңістіктерінің санын өзгерткіміз келеді делік. Көріп отырғанымыздай, біздің sqlQuery - NativeQueryImpl. түймесін басып Ctrl+N, сыныптың атын жазып, оған өтіңіз. Біз сыныпқа барған кезде біз осы сынып орналасқан жерге ауыстырылып, автоайналдыруды қосамыз:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 4
Idea қазіргі уақытта бағдарламаның бастапқы codeын (бастапқы code, яғни) қайдан табуға болатынын білмейтінін бірден атап өтейік. Сондықтан ол біз үшін сынып файлындағы мазмұнды мейірімділікпен декомпиляциялады:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 5
Сондай-ақ IntelliJ Idea терезесінің атауында Gradle артефакті біз үшін қай жерде сақталатыны жазылғанын ескеріңіз. Енді біздің артефакт орналасқан жолды қарастырайық:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 6
пәрменін пайдаланып пәрмен жолында осы каталогқа барайық cd way to каталогу. Мен бірден ескертпе жасаймын: егер жобаны көзден құру мүмкін болса, көзден құрастырған дұрыс. Мысалы, Hibernate бастапқы codeы ресми веб-сайтта қол жетімді. Оны қалаған нұсқа үшін таңдап, барлық өзгерістерді сол жерде жасап, жобада көрсетілген құрастыру сценарийлерін пайдаланып жинаған дұрыс. Мен мақалада ең қорқынышты нұсқаны ұсынамын - құмыра бар, бірақ бастапқы code жоқ. Және №2 ескертпе: Gradle плагиндер арқылы бастапқы codeты ала алады. Мәліметтер алу үшін Gradle көмегімен javadoc файлдары мен дереккөздерді қалай жүктеп алуға болады бөлімін қараңыз .

Өзгеріс жасау

Біз өзгертетін класс қай пакетке сәйкес каталог құрылымын қайта құруымыз керек. Бұл жағдайда: mkdir org\hibernate\query\internal, содан кейін біз осы каталогта файл жасаймыз NativeQueryImpl.java. Енді біз бұл файлды ашып, сыныптың барлық мазмұнын IDE-ден көшіреміз (Идеа біз үшін декомпиляция жасаған). Қажетті жолдарды өзгертіңіз. Мысалы:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 7
Енді файлды құрастырайық. Біз жасаймыз: javac org\hibernate\query\internal\NativeQueryImpl.java. Уау, сіз оны жай ғана қабылдап, қатесіз құрастыра алмайсыз. Біз таңбаны табу мүмкін емес қателерінің жиынтығын алдық, себебі... өзгермелі класс IntelliJ Idea әдетте біз үшін сынып жолына қосатын басқа сыныптармен байланысты. Сіз біздің IDE-нің барлық пайдалылығын сезінесіз бе? =) Жарайды, өзіміз қосайық, біздің де қолымыздан келеді. Жолдарды көшіріп алайық:
  • [1] - күту-ядро-5.2.17.Final.jar
  • [2] - hibernate-jpa-2.1-api-1.0.0.Final.jar
Дәл біз жасағандай: «Сыртқы кітапханалардағы» «Жоба» көрінісінде біз қажетті банканы тауып, түймесін басыңыз Ctrl+Shift+C. Енді келесі пәрменді жасап, орындаймыз: javac -cp [1];[2] org\hibernate\query\internal\NativeQueryImpl.java Нәтижесінде java файлының жанында жаңа класс файлдары пайда болады, оларды jar файлында жаңарту қажет:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 8
Ура, енді банканы жаңартуға болады. Бізге ресми материалдарды басшылыққа алуға болады : jar uf hibernate-core-5.2.17.Final.jar org\hibernate\query\internal\*.class Open IntelliJ Idea файлдарды өзгертуге мүмкіндік бермейді. Сондықтан, банканы жаңартуды орындамас бұрын, Idea қолданбасын жабуыңыз керек, ал жаңартудан кейін оны ашыңыз. Осыдан кейін IDE қайта ашып, қайталауды қайта іске қосуға болады. Үзіліс нүктелері IDE қайта іске қосылуы арасында қалпына келтірілмейді. Демек, бағдарламаның орындалуы бұрын болған жерде тоқтайды. Voila, біз өзгертулеріміздің қалай жұмыс істейтінін көреміз:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 9
Тамаша. Бірақ бұл жерде сұрақ туындайды - неге байланысты? Тек gradle жобаны құрастырған кезде тәуелділіктер мен репозиторийлер блогын талдайтындығына байланысты. Gradle-де белгілі бір жерде орналасқан белгілі құрастырылған кэш бар (« Градл кэшінің орнын қалай орнатуға болады? » бөлімін қараңыз. Егер кэште тәуелділік болмаса, Gradle оны репозиторийден жүктеп алады. Біз банкадағы банканы өзгерткендіктен кэштің өзі, содан кейін Gradle кітапхана кэште және ештеңені сорып шығармайды деп ойлайды.Бірақ кэшті кез келген тазарту біздің өзгертулеріміздің жоғалуына әкеледі.Сонымен қатар, бізден басқа ешкім барып, оларды ала алмайды. Қаншама қолайсыздық , солай емес пе? Не істеу керек. Хмм, репозиторийден жүктеп алулар? Сондықтан бізге преференциялар мен ақындар бар репозиторий керек. Бұл келесі қадам.

Репозиторийді қолдану

Репозиторийді орналастырудың әртүрлі тегін шешімдері бар: олардың бірі - Artifactory , ал екіншісі - Apache Archive . Артефактор сәнді, стильді, заманауи көрінеді, бірақ мен онымен қиындықтарға тап болдым, артефактілерді дұрыс орналастырғым келмеді және қате мавен метадеректерін жасадым. Сондықтан мен үшін күтпеген жерден Apache нұсқасы мен үшін жұмыс істеді. Бұл соншалықты әдемі емес болып шықты, бірақ ол сенімді жұмыс істейді. Жүктеп алу бетінде Оқшау нұсқасын тауып, оны орауыштан шығарыңыз. Олардың өздерінің « Жылдам бастауы » бар. Іске қосқаннан кейін мекенжайды күту керек http://127.0.0.1:8080/#repositorylist. Осыдан кейін «Артефактты жүктеп салу» таңдаңыз:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 10
«Жүктеп салуды бастау», содан кейін «Файлдарды сақтау» түймесін басыңыз. Осыдан кейін жасыл сәттілік хабары пайда болады және артефакт «Шолу» бөлімінде қолжетімді болады. Бұл jar және pom файлдары үшін жасалуы керек:
IntelliJ идеясы: декомпиляция, құрастыру, ауыстыру (немесе басқа адамдардың қателерін қалай түзетуге болады) - 11
Бұл pom файлында қосымша күту тәуелділіктерінің көрсетілгеніне байланысты. Бізде тек 1 қадам қалды - құрастыру сценарийінде репозиторийді көрсетіңіз:

repositories {
    jcenter()
    maven {
        url "http://127.0.0.1:8080/repository/internal/"
    }
}
Және, тиісінше, біздің қысқы күйіміздің нұсқасы болады: compile 'org.hibernate:hibernate-core:5.2.17.Final-JAVARUSH'. Міне, қазір біздің жобада түпнұсқа емес, біз түзетілген нұсқа қолданылады.

Қорытынды

Танысып қалған сияқтымыз. Қызықты болды деп үміттенемін. Мұндай «трюктар» сирек жасалады, бірақ кенеттен сіздің бизнес талаптарыңыз сіз пайдаланатын кітапханалар қанағаттандыра алмайтын шарттарды орнатса, сіз не істеу керектігін білесіз. Иә, мына жолмен түзетуге болатын бірнеше мысал бар:
  • Undertow деп аталатын веб-server бар. Біраз уақытқа дейін проксиді пайдалану кезінде соңғы пайдаланушының IP мекенжайын анықтауға мүмкіндік бермейтін қате болды.
  • Әзірше, WildFly JPA белгілі бір жолмен спецификациямен ескерілмеген бір сәтті өңдеді, осыған байланысты Ерекшеліктер тасталды. Және ол конфигурацияланбады.
#Вячеслав
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION