JavaRush /Блоги Java /Random-TG /IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё...
Viacheslav
Сатҳи

IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон)

Дар гурӯҳ нашр шудааст
«Чархро аз нав ихтироъ накунед» яке аз коидахои асосии кори бомуваффакият ва самарабахш мебошад. Аммо чӣ бояд кард, вақте ки шумо намехоҳед чархи худро аз нав ихтироъ кунед, аммо рули ягон каси дигар каҷ ва чархҳо мураббаъ мешаванд? Ин барраси пешбинӣ шудааст, ки ба қадри имкон муқаддимаи мухтасар дар бораи техникаи ислоҳи китобхонаҳои одамони дигар "ҳамчун чораи охирин" ва чӣ гуна паҳн кардани ин масъала берун аз компютери шумо бошад.
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 1

Муқаддима

Мо ҳама аз ин ё он асбоб истифода мебарем. Аммо баъзан асбобҳо комилан мувофиқ нестанд ё хатогиҳо доранд. Ба шарофати хусусиятҳои забони Java, мо метавонем рафтори асбобҳоро дар ҷое, ки ба мо лозим аст, ислоҳ кунем. Ин хуб аст, вақте ки мо дар лоиҳаҳо саҳм мегузорем ва дархостҳои ҷалб мефиристем (шумо метавонед дар ин ҷо бештар хонед: “ GitHub - Ҳиссаи худро ба лоиҳаҳо ”). Аммо онҳо метавонанд фавран қабул нашаванд ва ё ҳатто онҳоро қабул намекунанд. Аммо барои эхтиёчоти лоиха хозир зарур аст. Ва дар ин ҷо, ман умедворам, ки ин мақола асбобҳоеро, ки барои мо ҳамчун таҳиягарон дастрасанд, нишон медиҳад. Мо бояд қадамҳои зеринро иҷро кунем, ки мо дар бораи он сӯҳбат хоҳем кард:
  • Масалан, як барномаи санҷишӣ омода кунед (бо истифода аз мисоли лоиҳаи Hibernate)
  • Ҷустуҷӯи макони тағйирёбанда
  • Тағйирот ворид кардан
  • Ҷойгиркунии репозиторий
Ҳамаи қадамҳои дар поён овардашуда барои OS Windows дода шудаанд, аммо барои системаҳои nix аналогҳо доранд. Пас, агар лозим бошад, шумо метавонед онҳоро такрор кунед.

Омодасозии мавзӯъ

Ҳамин тавр, ба мо лоиҳаи санҷишӣ лозим аст. Гибернат барои мо беҳтарин аст, зеро... он «усто, муд, замонавй». Ман ба тафсилоти зиёд намеравам, зеро... Мақола дар бораи Hibernate нест. Мо ҳама чизро зуд ва ба таври дақиқ иҷро мекунем. Ва мо, ба монанди таҳиягарони мувофиқ, системаи сохтмонро истифода хоҳем бурд. Масалан, Gradle низ барои мо мувофиқ аст, ки бояд барои ин мақола насб карда шавад ( https://gradle.org/install/ ). Аввалан, мо бояд як лоиҳа эҷод кунем. Maven барои ин архетипҳо дорад ва Gradle барои ин плагини махсус дорад: Gradle Init . Ҳамин тавр, сатри фармонро бо ҳар роҳе, ки ба шумо маълум аст, кушоед. Барои лоиҳа директория эҷод кунед, ба он равед ва фармонро иҷро кунед:

mkdir javarush 
cd javarush 
gradle init --type java-application
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 2
Пеш аз ворид кардани лоиҳа, биёед ба файле, ки тарзи сохтани онро тавсиф мекунад, баъзе тағйирот ворид кунем. Ин файл скрипти сохта номида мешавад ва build.gradle ном дорад. Он дар директорияе ҷойгир аст, ки дар он мо gradle init-ро иҷро кардем. Аз ин рӯ, мо онро танҳо мекушоем (масалан, дар Windows бо фармони start build.gradle). Мо дар он ҷо блоки " вобастагӣ " -ро пайдо мекунем, яъне. вобастагӣ. Ҳамаи зарфҳои тарафи сеюм, ки мо истифода хоҳем кард, дар ин ҷо тавсиф карда шудаанд. Акнун мо бояд фаҳмем, ки дар ин ҷо чӣ тасвир кардан лозим аст. Биёед ба вебсайти Hibernate равем ( http://hibernate.org/ ). Мо ба Hibernate ORM таваҷҷӯҳ дорем . Мо ба versionи охирин ниёз дорем. Дар менюи тарафи чап зербахши "Варақаҳо" мавҷуд аст. "Охиртарин мӯътадил" -ро интихоб кунед. Ба поён ҳаракат кунед ва "Татбиқи асосӣ (дар бар мегирад JPA)" -ро пайдо кунед. Қаблан дастгирии JPA-ро алоҳида пайваст кардан лозим буд, аммо ҳоло ҳама чиз соддатар шудааст ва танҳо як вобастагӣ кофӣ аст. Мо инчунин бояд бо пойгоҳи додаҳо бо истифода аз Hibernate кор кунем. Барои ин, биёед соддатарин вариантро гирем - Database H2 . Интихоб карда мешавад, инҳо вобастагии мо ҳастанд:

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'
}
Аҷаб, оянда чӣ мешавад? Мо бояд Hibernate-ро танзим кунем. Hibernate дорои " Дастури оғозёбӣ " мебошад, аммо он аблаҳона аст ва монеаест, ки на аз кӯмак. Аз ин рӯ, биёед ба мисли одамони мувофиқ рост ба " Дастури корбар " биравем. Дар ҷадвали мундариҷа мо қисмати " 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. Намудҳои харитасозӣ" мисоли оддии an objectро мебинем. Биёед онро ба худ гирем ва онро каме кӯтоҳ кунем:
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;
    }
}
Ҳоло мо синфе дорем, ки an objectро ифода мекунад. Биёед ба persistence.xml баргардем ва дар он ҷо як ҷойро ислоҳ кунем: Дар ҷое, ки нишон дода шудааст, classмо синфи худро нишон медиҳем entity.Contact. Аҷоиб, танҳо оғози кор боқӣ мемонад. Биёед ба боби Bootstrap баргардем . Азбаски мо serverи барномавӣ надорем, ки ба мо муҳити махсуси EE (яъне, муҳите, ки рафтори муайяни системаро барои мо амалӣ мекунад) таъмин кунад, мо дар муҳити 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 ё тавассути менюи Иҷро кардан -> Нуқтаи шикастани хатро иваз кардан мумкин аст. Пас, мо усули асосии худро дар debug иҷро мекунем (Иҷро кардан -> Debug):
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 3
Як мисоли нофаҳмо, аммо биёед бигӯем, ки мо мехоҳем шумораи ҷойҳои дархостро ҳангоми оғозёбӣ тағир диҳем. Тавре ки мо мебинем, sqlQuery мо NativeQueryImpl аст. -ро клик кунед Ctrl+N, номи синфро нависед ва ба он равед. Ҳамин тавр, вақте ки мо ба синф меравем, мо ба ҷойе, ки ин синф ҷойгир аст, интиқол дода мешавад ва автоматикунониро фаъол мекунем:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 4
Биёед фавран қайд кунем, ки Idea дар айни замон намедонад, ки рамзи сарчашмаи барномаро дар куҷо пайдо кунад (codeи сарчашма, яъне). Аз ин рӯ, вай бо меҳрубонӣ мундариҷаи файли синфро барои мо ҷудо кард:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 5
Инчунин қайд кунед, ки дар унвони равзанаи IntelliJ Idea навишта шудааст, ки Gradle артефактро барои мо нигоҳ медорад. Акнун, биёед дар идеяи роҳе, ки артефакти мо ҷойгир аст, гирем:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 6
Биёед бо истифода аз фармон ба ин директория дар сатри фармон равем cd way to каталогу. Ман фавран қайд хоҳам кард: агар лоиҳаро аз манбаъ сохтан имконпазир бошад, беҳтараш аз манбаъ сохтан беҳтар аст. Масалан, рамзи сарчашмаи Hibernate дар вебсайти расмӣ дастрас аст. Беҳтар аст, ки онро барои versionи дилхоҳ интихоб кунед ва ҳама тағиротро дар он ҷо ворид кунед ва бо истифода аз скриптҳои сохтмонӣ, ки дар лоиҳа нишон дода шудаанд, ҷамъ кунед. Ман дар мақола варианти даҳшатноктаринро пешниҳод мекунам - кӯза мавҷуд аст, аммо рамзи манбаъ нест. Ва қайди рақами 2: Gradle метавонад бо истифода аз плагинҳо рамзи сарчашмаро дастрас кунад. Барои тафсилот чӣ гуна javadocs ва манбаъҳоро барои jar бо истифода аз Gradle зеркашӣ кардан мумкин аст, нигаред .

Тағйирот ворид кардан

Мо бояд сохтори директорияро аз нав созем, ки мувофиқи он синфе, ки мо иваз мекунем, дар кадом баста аст. Дар ин ҳолат: mkdir org\hibernate\query\internal, пас аз он мо дар ин директория файл эҷод мекунем NativeQueryImpl.java. Ҳоло мо ин файлро мекушоем ва ҳамаи мундариҷаи синфро аз IDE дар он ҷо нусхабардорӣ мекунем (ҳамон файле, ки Idea барои мо декомпиляция кардааст). Сатрҳои заруриро иваз кунед. Барои намуна:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 7
Акнун биёед файлро тартиб диҳем. Мо мекунем: javac org\hibernate\query\internal\NativeQueryImpl.java. Вой, шумо наметавонед онро бигиред ва бидуни хатогӣ тартиб диҳед. Мо як қатор хатогиҳои Рамзро ёфтан мумкин нест, зеро... синфи тағирёбанда бо синфҳои дигар алоқаманд аст, ки IntelliJ Idea одатан ба роҳи синф барои мо илова мекунад. Оё шумо тамоми фоиданокии IDE-ҳои моро ҳис мекунед? =) Хуб, худамон илова мекунем, мо низ метавонем. Биёед роҳҳоро барои: нусхабардорӣ кунем:
  • [1] - hibernate-core-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 Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 8
Бале, акнун шумо метавонед навсозии зарфро иҷро кунед. Мо метавонем аз маводи расмӣ роҳнамоӣ кунем : jar uf hibernate-core-5.2.17.Final.jar org\hibernate\query\internal\*.class Open IntelliJ Idea эҳтимолан ба шумо имкон намедиҳад, ки файлҳоро тағир диҳед. Аз ин рӯ, пеш аз иҷрои навсозии кӯза, шумо эҳтимолан бояд Idea-ро пӯшед ва пас аз навсозӣ онро кушоед. Пас аз ин, шумо метавонед IDE-ро аз нав кушоед ва дубора дубагро иҷро кунед. Нуқтаҳои танаффус дар байни дубора оғоз кардани IDE барқарор карда намешаванд. Аз ин рӯ, иҷрои барнома дар он ҷое, ки қаблан буд, қатъ мешавад. Voila, мо мебинем, ки тағиротҳои мо чӣ гуна кор мекунанд:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 9
бузург. Аммо дар ин ҷо савол ба миён меояд - аз сабаби чӣ? Танҳо аз сабаби он, ки вақте ки gradle лоиҳаро месозад, он вобастагӣ ва блоки анборҳоро таҳлил мекунад. Gradle як кэши муайяни бунёдӣ дорад, ки дар як макони муайян ҷойгир аст (ниг. " Чӣ тавр ҷойгиршавии кэши gradle насб карда шавад? " Агар дар кэш ягон вобастагӣ мавҷуд набошад, Gradle онро аз анбор зеркашӣ мекунад. Азбаски мо кӯзаро дар худи кэш, пас Gradle фикр мекунад, ки китобхона дар кэш аст ва чизеро берун намекунад.Аммо ҳама гуна тоза кардани кэш боиси гум шудани тағиротҳои мо мегардад. Илова бар ин, ба ҷуз мо ҳеҷ кас наметавонад танҳо рафта онҳоро дастрас кунад. Чӣ қадар нороҳатӣ. , ҳамин тавр не? Чӣ бояд кард. Ҳмм, зеркашиҳо аз анбор? Пас, мо ба анбори худ бо афзалиятҳо ва шоирон ниёз дорем. Ин қадами оянда аст.

Ҷойгиркунии репозиторий

Роҳҳои гуногуни ройгон барои ҷойгиркунии анбори шумо мавҷуданд: яке аз онҳо Artifactory ва дигаре Archive Apache мебошад . Артефактура муд, услубӣ, замонавӣ ба назар мерасад, аммо ман бо он душворӣ доштам, ман намехостам артефактҳоро дуруст ҷойгир кунам ва метамаълумоти нодурусти maven тавлид кардам. Аз ин рӯ, ногаҳон барои худам, versionи Apache барои ман кор кард. Маълум шуд, ки он чандон зебо нест, аммо он боэътимод кор мекунад. Дар саҳифаи зеркашӣ versionи мустақилро ҷустуҷӯ кунед ва онро кушоед. Онҳо " Оғози зуд " -и худро доранд . Пас аз оғоз, шумо бояд то суроғаи http://127.0.0.1:8080/#repositorylist. Пас аз он, "Боркунии Артефакт" -ро интихоб кунед:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 10
"Оғози боркунӣ" ва сипас "Захира кардани файлҳо" -ро клик кунед. Пас аз ин, паёми муваффақияти сабз пайдо мешавад ва артефакт дар бахши "Муборак" дастрас мешавад. Ин бояд барои файлҳои jar ва pom анҷом дода шавад:
IntelliJ Idea: Декомпиляция, тартиб додан, иваз кардан (ё чӣ гуна ислоҳ кардани хатогиҳои дигарон) - 11
Ин ба он вобаста аст, ки вобастагии иловагии интизорӣ дар файли pom муайян карда шудааст. Ва мо танҳо 1 қадам мондаем - анборро дар скрипти сохтани мо муайян кунед:

repositories {
    jcenter()
    maven {
        url "http://127.0.0.1:8080/repository/internal/"
    }
}
Ва, мутаносибан, versionи хоби мо чунин мешавад: compile 'org.hibernate:hibernate-core:5.2.17.Final-JAVARUSH'. Ҳамааш ин аст, ҳоло лоиҳаи мо versionеро истифода мебарад, ки мо ислоҳ кардем, на нусхаи аслӣ.

Хулоса

Чунин ба назар мерасад, ки мо шинос шудаем. Умедворам ҷолиб буд. Чунин "ҳилаҳо" хеле кам анҷом дода мешаванд, аммо агар ногаҳон талаботи тиҷоратии шумо шартҳоеро муқаррар кунанд, ки китобхонаҳои шумо онҳоро қонеъ карда наметавонанд, шумо медонед, ки чӣ кор кардан лозим аст. Ва ҳа, инҳоянд чанд мисоле, ки онҳоро бо ин роҳ ислоҳ кардан мумкин аст:
  • Як serverи веб бо номи Undertow мавҷуд аст. То чанд вақт, хатогие вуҷуд дошт, ки ҳангоми истифодаи прокси ба мо имкон намедод, ки IP-и корбари ниҳоӣ фаҳмем.
  • Дар айни замон, WildFly JPA як лаҳзае, ки аз ҷониби мушаххасот ба инобат гирифта нашудааст, ба таври муайян кор кард, бинобар ин Истисноҳо партофта шуданд. Ва он танзимшаванда набуд.
#Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION