JavaRush /جاوا بلاگ /Random-UR /IntelliJ Idea: Decompilation، Compilation، Substitution (...
Viacheslav
سطح

IntelliJ Idea: Decompilation، Compilation، Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے)

گروپ میں شائع ہوا۔
"وہیل کو دوبارہ نہ بنائیں" کامیاب اور موثر کام کے لیے ایک اہم اصول ہے۔ لیکن کیا کریں جب آپ اپنے وہیل کو دوبارہ نہیں بنانا چاہتے، لیکن کسی اور کا اسٹیئرنگ وہیل ٹیڑھا ہو اور پہیے چوکور ہوں؟ اس جائزے کا مقصد دوسرے لوگوں کی لائبریریوں کو "آخری حربے کے طور پر" ٹھیک کرنے کی تکنیک کا ممکنہ حد تک مختصر تعارف فراہم کرنا ہے اور اس معاملے کو اپنے کمپیوٹر سے آگے کیسے بڑھایا جائے۔
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 1

تعارف

ہم سب ایک یا دوسرا ٹول استعمال کرتے ہیں۔ لیکن بعض اوقات اوزار مکمل طور پر موزوں نہیں ہوتے ہیں یا ان میں غلطیاں ہوتی ہیں۔ جاوا زبان کی خصوصیات کی بدولت، ہم ٹولز کے رویے کو درست کر سکتے ہیں جہاں ہمیں ضرورت ہو۔ یہ اچھا ہے جب ہم پروجیکٹس میں تعاون کرتے ہیں اور پل کی درخواستیں بھیجتے ہیں (آپ یہاں مزید پڑھ سکتے ہیں: " GitHub - پروجیکٹس میں تعاون کرنا ")۔ لیکن وہ فوری طور پر قبول نہیں ہوسکتے ہیں، یا وہ بھی قبول نہیں ہوسکتے ہیں. لیکن منصوبے کی ضروریات کے لیے اب یہ ضروری ہے۔ اور یہاں، مجھے امید ہے کہ یہ مضمون ہمارے لیے بطور ڈویلپرز دستیاب ٹولز دکھائے گا۔ ہمیں مندرجہ ذیل اقدامات کرنے کی ضرورت ہوگی جن کے بارے میں ہم بات کریں گے:
  • مثال کے طور پر ایک ٹیسٹ ایپلیکیشن تیار کریں (ہائبرنیٹ پروجیکٹ کی مثال کا استعمال کرتے ہوئے)
  • ایک قابل تغیر مقام تلاش کرنا
  • تبدیلی کرنا
  • مخزن کی تعیناتی
نیچے دیے گئے تمام اقدامات ونڈوز OS کے لیے دیے گئے ہیں، لیکن نکس سسٹمز کے لیے ینالاگ ہیں۔ لہذا اگر ضروری ہو تو آپ انہیں دوبارہ کر سکتے ہیں.

موضوع کی تیاری

لہذا، ہمیں ایک ٹیسٹ پروجیکٹ کی ضرورت ہے. ہائبرنیٹ ہمارے لیے مثالی ہے، کیونکہ... یہ "اسٹائلش، فیشن ایبل، جدید" ہے۔ میں زیادہ تفصیل میں نہیں جاؤں گا، کیونکہ... مضمون ہائبرنیٹ کے بارے میں نہیں ہے۔ ہم سب کچھ جلدی اور نقطہ نظر پر کریں گے۔ اور ہم، مناسب ڈویلپرز کی طرح، تعمیراتی نظام کا استعمال کریں گے۔ مثال کے طور پر، گریڈل ہمارے لیے بھی موزوں ہے، جسے اس مضمون کے لیے انسٹال کرنا ضروری ہے ( https://gradle.org/install/ )۔ سب سے پہلے، ہمیں ایک پروجیکٹ بنانے کی ضرورت ہے۔ Maven کے پاس اس کے لیے آثار قدیمہ ہیں ، اور Gradle کے پاس اس کے لیے ایک خاص پلگ ان ہے: Gradle Init ۔ لہذا، آپ کو معلوم کسی بھی طریقے سے کمانڈ لائن کھولیں۔ پروجیکٹ کے لیے ایک ڈائرکٹری بنائیں، اس پر جائیں اور کمانڈ پر عمل کریں:

mkdir javarush 
cd javarush 
gradle init --type java-application
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 2
پروجیکٹ کو درآمد کرنے سے پہلے، آئیے اس فائل میں کچھ تبدیلیاں کرتے ہیں جو کہ بنانے کا طریقہ بتاتی ہے۔ اس فائل کو بلڈ اسکرپٹ کہا جاتا ہے اور اسے build.gradle کا نام دیا گیا ہے۔ یہ اس ڈائریکٹری میں واقع ہے جس میں ہم نے gradle init کو عمل میں لایا تھا۔ لہذا، ہم اسے آسانی سے کھولتے ہیں (مثال کے طور پر، ونڈوز میں start build.gradle کمانڈ کے ساتھ)۔ ہمیں وہاں " انحصار " بلاک ملتا ہے، یعنی انحصار تمام تھرڈ پارٹی جار جو ہم استعمال کریں گے یہاں بیان کیے گئے ہیں۔ اب ہمیں یہ سمجھنے کی ضرورت ہے کہ یہاں کیا بیان کیا جائے۔ آئیے ہائبرنیٹ ویب سائٹ پر جائیں ( http://hibernate.org/ )۔ ہم ہائبرنیٹ ORM میں دلچسپی رکھتے ہیں ۔ ہمیں تازہ ترین ریلیز کی ضرورت ہے۔ بائیں طرف مینو میں ایک ذیلی سیکشن "ریلیز" ہے۔ "تازہ ترین مستحکم" کو منتخب کریں۔ نیچے سکرول کریں اور "بنیادی نفاذ (جے پی اے سمیت)" تلاش کریں۔ پہلے جے پی اے سپورٹ کو الگ سے جوڑنا ضروری تھا لیکن اب سب کچھ آسان ہو گیا ہے اور صرف ایک انحصار کافی ہے۔ ہمیں ہائبرنیٹ کا استعمال کرتے ہوئے ڈیٹا بیس کے ساتھ بھی کام کرنے کی ضرورت ہوگی۔ ایسا کرنے کے لیے، آئیے سب سے آسان آپشن لیتے ہیں - 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'
}
بہت اچھا، آگے کیا ہے؟ ہمیں ہائبرنیٹ کو ترتیب دینے کی ضرورت ہے۔ ہائبرنیٹ کے پاس " شروع کرنے کی گائیڈ " ہے، لیکن یہ احمقانہ اور مدد سے زیادہ رکاوٹ ہے۔ لہذا، آئیے صحیح لوگوں کی طرح سیدھے " صارف گائیڈ " پر جائیں۔ مندرجات کے جدول میں ہم " بوٹسٹریپ " سیکشن دیکھتے ہیں ، جس کا ترجمہ "بوٹسٹریپ" ہوتا ہے۔ بس آپ کی ضرورت ہے۔ وہاں بہت سارے سمارٹ الفاظ لکھے گئے ہیں، لیکن بات یہ ہے کہ کلاس پاتھ پر ایک META-INF ڈائرکٹری ہونی چاہیے، اور ایک persistence.xml فائل ہونی چاہیے۔ معیار کے مطابق، کلاس پاتھ میں "وسائل" ڈائریکٹری ہوتی ہے۔ لہذا، ہم مخصوص ڈائریکٹری بناتے ہیں: mkdir src\main\resources\META-INF وہاں persistence.xml فائل بنائیں اور اسے کھولیں۔ دستاویزات میں ایک مثال ہے "Example 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۔ بہت اچھا، جو کچھ باقی ہے وہ لانچ کرنا ہے۔ آئیے بوٹسٹریپ باب کی طرف لوٹتے ہیں ۔ چونکہ ہمارے پاس کوئی ایپلیکیشن سرور نہیں ہے جو ہمیں ایک خاص EE ماحول فراہم کرے (یعنی ایسا ماحول جو ہمارے لیے نظام کے مخصوص رویے کو نافذ کرتا ہے)، ہم SE ماحول میں کام کرتے ہیں۔ اس کے لیے، صرف مثال "Example 269. Application bootstrapped 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 کے ذریعے کیا جا سکتا ہے۔ پھر ہم اپنا بنیادی طریقہ ڈیبگ میں چلاتے ہیں (رن -> ڈیبگ):
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 3
ایک اناڑی مثال کا تھوڑا سا، لیکن ہم کہتے ہیں کہ ہم شروعات میں استفسار کی جگہوں کی تعداد کو تبدیل کرنا چاہتے ہیں۔ جیسا کہ ہم دیکھ سکتے ہیں، ہماری sqlQuery NativeQueryImpl ہے۔ کلک کریں Ctrl+N، کلاس کا نام لکھیں، اور اس پر جائیں۔ تاکہ جب ہم کسی کلاس میں جائیں تو ہمیں اس جگہ منتقل کر دیا جائے جہاں یہ کلاس واقع ہے اور آٹو سکرول کو آن کریں:
IntelliJ Idea: Decompilation، Compilation، Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 4
آئیے فوری طور پر نوٹ کریں کہ آئیڈیا فی الحال نہیں جانتا ہے کہ پروگرام کا سورس کوڈ کہاں سے تلاش کرنا ہے (ماخذ کوڈ، یعنی)۔ لہٰذا، اس نے ہمارے لیے کلاس فائل سے مشمولات کو مہربانی کرکے ڈی کمپائل کیا:
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 5
یہ بھی نوٹ کریں کہ IntelliJ Idea ونڈو کے ٹائٹل میں یہ لکھا ہے جہاں Gradle ہمارے لیے نمونے محفوظ کرتا ہے۔ اب آئیڈیا میں اس راستے پر جائیں جہاں ہمارا نمونہ واقع ہے:
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 6
آئیے کمانڈ کا استعمال کرتے ہوئے کمانڈ لائن پر اس ڈائریکٹری میں جائیں cd way to каталогу۔ میں ابھی ایک نوٹ بناؤں گا: اگر سورس سے پروجیکٹ بنانا ممکن ہے تو سورس سے بنانا بہتر ہے۔ مثال کے طور پر، ہائبرنیٹ سورس کوڈ آفیشل ویب سائٹ پر دستیاب ہے۔ بہتر ہے کہ اسے مطلوبہ ورژن کے لیے اٹھائیں اور وہاں تمام تبدیلیاں کریں اور پروجیکٹ میں بتائی گئی تعمیراتی اسکرپٹس کا استعمال کرتے ہوئے اسمبل کریں۔ میں مضمون میں سب سے خوفناک آپشن پیش کرتا ہوں - ایک جار ہے، لیکن کوئی سورس کوڈ نہیں ہے۔ اور نوٹ نمبر 2: گریڈل پلگ ان کا استعمال کرکے سورس کوڈ حاصل کرسکتا ہے۔ تفصیلات کے لیے Gradle کا استعمال کرتے ہوئے javadocs اور جار کے ذرائع کو ڈاؤن لوڈ کرنے کا طریقہ دیکھیں ۔

تبدیلی کرنا

ہمیں ڈائرکٹری کے ڈھانچے کو دوبارہ بنانے کی ضرورت ہے جس کے مطابق ہم جس کلاس کو تبدیل کر رہے ہیں وہ کس پیکیج میں ہے۔ اس صورت میں:، mkdir org\hibernate\query\internalجس کے بعد ہم اس ڈائریکٹری میں ایک فائل بناتے ہیں NativeQueryImpl.java۔ اب ہم اس فائل کو کھولتے ہیں اور وہاں کے IDE سے کلاس کے تمام مواد کو کاپی کرتے ہیں (وہی جو آئیڈیا نے ہمارے لیے ڈی کمپائل کیا تھا)۔ ضروری لائنوں کو تبدیل کریں۔ مثال کے طور پر:
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 7
اب، فائل کو مرتب کرتے ہیں۔ ہم کرتے ہیں: javac org\hibernate\query\internal\NativeQueryImpl.java. واہ، آپ اسے لے کر غلطیوں کے بغیر مرتب نہیں کر سکتے۔ ہمیں علامت کی غلطیوں کا ایک گروپ موصول ہوا ہے، کیونکہ... mutable کلاس دوسری کلاسوں سے منسلک ہے، جسے IntelliJ Idea عام طور پر ہمارے لیے کلاس پاتھ میں شامل کرتا ہے۔ کیا آپ ہمارے IDEs کی تمام افادیت محسوس کرتے ہیں؟ =) ٹھیک ہے، آئیے اسے خود شامل کریں، ہم بھی کر سکتے ہیں۔ آئیے اس کے لیے راستوں کو کاپی کرتے ہیں:
  • [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 نتیجے کے طور پر، نئی کلاس فائلیں جاوا فائل کے آگے ظاہر ہوں گی، جنہیں جار فائل میں اپ ڈیٹ کرنے کی ضرورت ہے۔
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 8
ہیرے، اب آپ جار اپ ڈیٹ کر سکتے ہیں۔ ہم سرکاری مواد سے رہنمائی حاصل کر سکتے ہیں : jar uf hibernate-core-5.2.17.Final.jar org\hibernate\query\internal\*.class اوپن انٹیلی جے آئیڈیا آپ کو فائلوں کو تبدیل کرنے کی اجازت نہیں دے گا۔ اس لیے، جار اپڈیٹ کرنے سے پہلے، آپ کو غالباً آئیڈیا کو بند کرنا پڑے گا، اور اپ ڈیٹ کے بعد اسے کھولنا پڑے گا۔ اس کے بعد، آپ IDE کو دوبارہ کھول سکتے ہیں اور دوبارہ ڈبگ چلا سکتے ہیں۔ IDE دوبارہ شروع ہونے کے درمیان بریک پوائنٹس کو دوبارہ ترتیب نہیں دیا جاتا ہے۔ لہذا، پروگرام پر عمل درآمد وہیں رک جائے گا جہاں پہلے تھا۔ Voila، ہم دیکھتے ہیں کہ ہماری تبدیلیاں کیسے کام کرتی ہیں:
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 9
زبردست. لیکن یہاں سوال یہ پیدا ہوتا ہے کہ کس وجہ سے؟ محض اس حقیقت کی وجہ سے کہ جب گریڈل ایک پروجیکٹ بناتا ہے، تو یہ انحصار اور ذخیروں کے بلاک کا تجزیہ کرتا ہے۔ گریڈل کے پاس ایک مخصوص بلڈ کیش ہے، جو ایک مخصوص جگہ پر واقع ہے (دیکھیں " گریڈل کیشے لوکیشن کیسے سیٹ کریں؟ " اگر کیشے میں کوئی انحصار نہیں ہے، تو گریڈل اسے ریپوزٹری سے ڈاؤن لوڈ کرے گا۔ چونکہ ہم نے جار کو اس میں تبدیل کیا ہے۔ خود کیش، پھر گریڈل سوچتا ہے کہ لائبریری کیشے میں ہے اور کچھ بھی پمپ نہیں کرتی ہے۔ لیکن کیش کو صاف کرنے سے ہماری تبدیلیاں ضائع ہو جائیں گی۔ اس کے علاوہ، ہمارے علاوہ کوئی بھی جا کر انہیں حاصل نہیں کر سکتا۔ کتنی تکلیف ہو گی۔ ، ہے نا؟ کیا کرنا ہے۔ ہمم، ذخیرہ سے ڈاؤن لوڈ؟ تو ہمیں ترجیحات اور شاعروں کے ساتھ اپنے ذخیرہ کی ضرورت ہے۔ یہ اگلا مرحلہ ہے۔

مخزن کی تعیناتی

آپ کے ذخیرے کو تعینات کرنے کے لیے مختلف مفت حل ہیں: ان میں سے ایک ہے Artifactory ، اور دوسرا Apache Archive ۔ آرٹفیکٹری فیشن ایبل، اسٹائلش، جدید نظر آتی ہے، لیکن مجھے اس کے ساتھ مشکلات کا سامنا کرنا پڑا، میں نمونے کو صحیح طریقے سے نہیں رکھنا چاہتا تھا اور اس نے غلط میون میٹا ڈیٹا تیار کیا۔ لہذا، غیر متوقع طور پر اپنے لیے، اپاچی ورژن نے میرے لیے کام کیا۔ یہ اتنا خوبصورت نہیں ہے، لیکن یہ قابل اعتماد کام کرتا ہے. ڈاؤن لوڈ کے صفحے پر ، اسٹینڈ اکیلا ورژن تلاش کریں اور اسے کھولیں۔ ان کا اپنا " کوئیک سٹارٹ " ہے۔ لانچ کرنے کے بعد، آپ کو پتہ تک انتظار کرنا ہوگا http://127.0.0.1:8080/#repositorylist۔ اس کے بعد، "اپ لوڈ آرٹفیکٹ" کو منتخب کریں:
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 10
"اپ لوڈ شروع کریں" پر کلک کریں اور پھر "فائلیں محفوظ کریں" پر کلک کریں۔ اس کے بعد، ایک سبز کامیابی کا پیغام ظاہر ہوگا اور آرٹفیکٹ "براؤز" سیکشن میں دستیاب ہو جائے گا. یہ جار اور پوم فائلوں کے لئے کیا جانا چاہئے:
IntelliJ Idea: Decompilation, Compilation, Substitution (یا دوسرے لوگوں کی غلطیوں کو کیسے درست کیا جائے) - 11
یہ اس حقیقت کی وجہ سے ہے کہ اضافی ہائبرنیٹ انحصار پوم فائل میں بیان کیا گیا ہے۔ اور ہمارے پاس صرف 1 قدم باقی ہے - ہمارے بلڈ اسکرپٹ میں ذخیرہ کی وضاحت کریں:

repositories {
    jcenter()
    maven {
        url "http://127.0.0.1:8080/repository/internal/"
    }
}
اور، اس کے مطابق، ہمارے ہائبرنیٹ کا ورژن بن جائے گا: compile 'org.hibernate:hibernate-core:5.2.17.Final-JAVARUSH'۔ بس، اب ہمارا پروجیکٹ وہی ورژن استعمال کرتا ہے جسے ہم نے درست کیا تھا، نہ کہ اصل والا۔

نتیجہ

ایسا لگتا ہے جیسے ہم واقف ہو گئے ہیں۔ مجھے امید ہے کہ یہ دلچسپ تھا۔ ایسی "ٹرکس" شاذ و نادر ہی کی جاتی ہیں، لیکن اگر اچانک آپ کے کاروباری تقاضے ایسے حالات قائم کر دیتے ہیں کہ آپ جو لائبریریاں استعمال کرتے ہیں وہ پوری نہیں کر سکتیں، تو آپ جانتے ہیں کہ کیا کرنا ہے۔ اور ہاں، یہاں چند مثالیں ہیں جنہیں اس طرح درست کیا جا سکتا ہے:
  • انڈرٹو نامی ایک ویب سرور ہے۔ کچھ وقت تک، ایک ایسا بگ تھا جو پراکسی استعمال کرتے وقت ہمیں آخری صارف کا IP معلوم کرنے کی اجازت نہیں دیتا تھا۔
  • فی الحال، وائلڈ فلائی جے پی اے نے ایک خاص طریقے سے ہینڈل کیا ایک لمحے کو تصریح کے حساب سے نہیں لیا گیا، اس کی وجہ سے استثناء کو پھینک دیا گیا۔ اور یہ قابل ترتیب نہیں تھا۔
#ویاچسلاو
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION