JavaRush /Java Blog /Random-ID /Kompilasi di Jawa

Kompilasi di Jawa

Dipublikasikan di grup Random-ID
Pemrograman dalam IDE sangat bagus: koherensi ketergantungan kode, debugging yang mudah, pengujian yang jelas, tema gelap. Jadi, berkat IDE, pembangunan berkembang pesat. Tapi dia santai. Setiap hari, dengan membenamkan dirinya dalam fungsionalitas IDE, pengembang terbiasa melakukan dengan satu tombol atau membangun dengan dua klik. Kompilasi di Java - 1Situasinya jauh lebih buruk bagi mereka yang baru mengenal pemrograman yang bekerja di IDE sejak awal, mengabaikan pekerjaan pada baris perintah. Misalnya, di Intellij IDEA, kompilasi aplikasi Java ditunjukkan oleh bilah pemuatan di panel bawah, dan semua parameter kompilasi, pemrosesan classpath, dan kesenangan lain dari kehidupan Java tetap berada di belakang layar. Kami menyarankan untuk membicarakan tentang kompilasi di Java tanpa IDE. Untuk menjalankan contoh dalam artikel ini, pastikan JDK 1.7 atau lebih baru diinstal pada mesin Anda.

Bagaimana cara mengkompilasi suatu program?

Kompilasi dalam pemrograman adalah pengurangan kode sumber menjadi bytecode untuk permulaan program berikutnya. Urutan tindakan dari kode sumber hingga peluncuran program adalah sebagai berikut:
  1. Ada kode sumber dalam file bernama ClassName.java;
  2. Jika tidak ada kesalahan dalam kode, maka dikompilasi menjadi bytecode (dalam file ClassName.class);
  3. Program dimulai.
Biasanya, setiap program terdapat dalam direktori terpisah. Sebagai contoh sederhana, mari kita ambil keluarannya ke konsol:
class Test {
   public static void main(String[] args) {
      System.out.println("Это говорит приложение из командной строки");
   }
}

Untuk apa perintah javac digunakan?

Oke, poin pertama sudah selesai. Mari kita melangkah lebih jauh untuk memahami: bagaimana cara mengkompilasinya? :) Perintah javac akan membantu kita dalam hal ini, argumennya harus menentukan file yang diperlukan:

javac Test.java
Jika tidak ada kesalahan pada kode, file Test.class akan muncul di sebelah file Test.java. Ini adalah bytecode yang dikompilasi. Sekarang perlu diluncurkan. Di sini kita menggunakan perintah java, yang menjalankan bytecode: Kompilasi di Java - 2Tangkapan layar menunjukkan bahwa kita mendapatkan beberapa hieroglif di output: jelas, ini adalah pengkodean yang rusak. Biasanya ini terjadi pada sistem Windows. Untuk menampilkan alfabet Sirilik dengan benar di konsol, ada perintah berikut:

REM change CHCP to UTF-8
CHCP 65001
CLS
Mereka mengubah halaman kode shell saat ini selama jendela saat ini. Mari coba lagi:

D:\Java>java Test
Inilah yang dikatakan aplikasi dari baris perintah. Mengetahui cara kerja perintah javac sangat berguna, karena perintah ini adalah dasar dari setiap sistem pembangunan proyek.

Mengompilasi dan Menjalankan Beberapa Kelas

Untuk bekerja dengan banyak kelas, Anda memerlukan jalur kelas. Ini mirip dengan sistem file yang berisi kelas-kelas, dan paket-paket bertindak sebagai folder. Pada titik ini, ada baiknya memikirkan untuk memisahkan file kode sumber dari file yang dikompilasi. Biasanya, sumber terletak di direktori src, dan kelas yang dikompilasi ada di bin. Misalnya, kita mempunyai kelas Boxdan kelas BoxMachineyang berisi metode main. Kelas Box:
package src;

public class Box {
   private double size;

   public Box(double size) {
       this.size = size;
   }

   public String toString() {
       return "Box have size " + size;
   }
}
Itu ada dalam paket src dan perlu diperbaiki. Kelas BoxMachine:
package src;

public class BoxMachine {
   public static void main(String[] args) {
       for(int  i = 0; i < 5; i++) {
           System.out.println(new Box(Math.random()*10));
       }
   }
}
Kelas ini juga ditemukan dalam paket src. Dalam metode ini main, ia membuat lima objek kelas Boxdengan ukuran berbeda dan menampilkan informasi tentang objek tersebut ke konsol. Untuk mengkompilasi grup kelas ini, Anda harus menggunakan perintah javac dari direktori utama (yang berisi folder src dan bin) dengan argumen:

javac -d bin ./src/*
-d— sebuah bendera yang setelahnya Anda harus menunjukkan lokasi di mana kelas yang dikompilasi akan dituju. Ini sangat mudah, karena mentransfer, misalnya, 1000 kelas adalah proses yang sangat memakan waktu. bin- nama folder. ./src/*— lokasi file sumber. *menunjukkan bahwa semua file harus dikompilasi. Sekarang kelas yang dikompilasi muncul di folder bin. Untuk menjalankannya, gunakan perintah java dari direktori yang sama, juga dengan argumen:

java -classpath ./bin BoxMachine
-classpath— sebuah bendera yang setelahnya Anda harus menunjukkan lokasi kelas yang dikompilasi. Java akan mencari kelas utama dan semua kelas terkait di direktori ini. ./bin— nama folder tempat kelas yang dikompilasi berada. BoxMachine— nama kelas utama. Seperti pada kasus pertama, tidak boleh ditentukan .class, karena ini adalah nama kelas, bukan file. Kesimpulan:

D:\Java>java -classpath ./bin src.BoxMachine
Box have size 4.085985295359718
Box have size 8.63682158248986
Box have size 6.027448124299726
Box have size 7.288317703877914
Box have size 1.106181659384694

Membuat File JAR

Untuk membuat program mudah di-porting dan dijalankan, Anda dapat mengumpulkan kelas-kelas yang dikompilasi ke dalam file jar - arsip kelas. Perbedaan utama dari arsip zip atau rar adalah adanya file manifes. Manifes ini menentukan kelas utama yang akan dijalankan ketika file jar dijalankan, classpath, dan banyak informasi tambahan. Mari buat file manifest.mf di direktori utama. Isinya adalah sebagai berikut:

main-class: src.BoxMachine
class-path: bin/
main-classmenentukan kelas yang berisi metode maindan akan dieksekusi saat startup. class-path— jalur ke kelas yang dikompilasi atau perpustakaan tambahan. Sekarang saatnya membangun program nyata tanpa IDE menggunakan perintah jar:

jar -cmf manifest.mf box-machine.jar  -C bin .
-cmf— sebuah tanda yang setelahnya Anda harus menentukan jalur ke file manifes. manifest.mf— jalan menuju manifes. box-machine.jar— nama file jar keluaran. — sebuah tanda yang menunjukkan jalur ke kelas yang dikompilasi. .— jalur dimana file jar akan ditempatkan. Dalam kasus kami, ini adalah direktori utama. Sekarang Anda dapat meluncurkannya. Meluncurkan file jar juga dilakukan dengan menggunakan perintah java, tetapi kemudian Anda perlu menentukan tandanya -jar: ini menunjukkan bahwa file Jar sedang diluncurkan, dan argumen kedua adalah jalur ke jarfile tersebut, termasuk ekstensi :

java -jar box-machine.jar
Kesimpulan:

Box have size 5.5495235762547965
Box have size 9.695870044165662
Box have size 2.3408385788129227
Box have size 7.2790741216674135
Box have size 2.3620854470160513

Kompilasi di Java tanpa IDE: Gambaran Umum Sistem Build

Meskipun penggunaan baris perintah relatif mudah, sangat sulit untuk membangun proyek menengah dan besar dengan menggunakannya. Ini membutuhkan banyak waktu dan penuh dengan kesalahan dalam berbagai tingkat. Untungnya, ada sistem perakitan yang membuat proses kerja lebih mudah. Dengan beberapa tim, sistem ini dapat merakit proyek dengan kompleksitas apa pun, dan banyaknya plugin yang dibuat selama keberadaan sistem tersebut dapat menghilangkan hampir semua sakit kepala.

Bagaimana cara mengkompilasi Java?

Sistem build Java yang paling terkenal adalah Ant, Maven, dan Gradle. Tidak ada yang baik atau buruk: masing-masing diciptakan untuk memecahkan masalah tertentu. Mari kita lihat masing-masing secara lebih rinci.

Semut

Ant adalah alat pembangunan yang menggunakan skrip yang dijelaskan menggunakan file xml. struktur file xml:
<?xml version="1.0"?>
<project name="NameПроекта" default="сценарийПоУмолчанию">
    <target name="NameСценария">
  //  Действия сценария
        <echo>Hello, World!</echo>
    </target>
  //  Второй сценарий
  //  И тд
</project>
Mari kita buat file build.xml di direktori utama dengan isi sebagai berikut:
<?xml version="1.0"?>
<project name="BoxMachine" default="test">
   <target name="test">
       <echo>First build in Ant!</echo>
   </target>
</project>
Di direktori yang sama, panggil perintah ant:

D:\Java>D:\Temp\ant\bin\ant
Buildfile: D:\Java\build.xml

test:
     [echo] First build in Ant!

BUILD SUCCESSFUL
Total time: 0 seconds
Tag <target>dapat menentukan berbagai tugas yang memungkinkan Anda mengelola rakitan dan sistem file. Ant memiliki lebih dari 150 perintah yang tersedia, yang tercantum dalam dokumentasi. Pada contoh di bawah ini kami hanya menggunakan 5:
  • mkdir - membuat direktori
  • delete- menghapus file dan direktori
  • javac- Kompilasi kode Java
  • java- menjalankan kode yang dikompilasi
Seperti inilah skrip kompilasi, pembuatan, atau pembersihan sederhana:
<?xml version="1.0"?>
<project name="BoxMachine" default="compile">
   <target name="compile">
       <mkdir dir="result/classes"/>
       <javac destdir="result/classes" includeantruntime="false">
           <src path="src"/>
       </javac>
   </target>
   <target name="run" depends="compile">
       <java classname="BoxMachine" classpath="result/classes"/>
   </target>
   <target name="clean">
       <delete dir="result"/>
   </target>
</project>
Skrip ini menjelaskan tiga tindakan - compile, ,code>run dan clean. compilemembuat direktori hasil dengan kelas di dalamnya, kemudian menggunakan javac untuk mengkompilasi kelas ke dalam direktori yang dibuat. runmenjalankan kelas yang dikompilasi dengan perintah java. cleanmenghapus direktori hasil. Jika Anda menjalankan perintah ant tanpa argumen di direktori utama, tindakan kompilasi akan dijalankan. Jika tindakan tertentu perlu dilakukan, tindakan tersebut ditentukan dalam argumen.

D:\Java>D:/Temp/ant/bin/ant compile
Buildfile: D:\Java\build.xml

compile:
    [mkdir] Created dir: D:\Java\result\classes
    [javac] Compiling 2 source files to D:\Java\result\classes

BUILD SUCCESSFUL
Total time: 1 second

Maven

Maven menawarkan pendekatan yang sedikit berbeda dalam proyek pembangunan. Di sini, pengembang lebih menjelaskan proyeknya dan alat tambahan yang ia gunakan, tidak seperti Ant, yang pembangunannya merupakan serangkaian tindakan. Maven populer di kalangan pengembang karena manajemen ketergantungannya yang mudah dan integrasi yang mudah dengan semua lingkungan pengembangan. Saat bekerja dengan Maven, kami mematuhi struktur proyek berikut: Kompilasi di Java - 3Aturan build, dependensi, dll. dijelaskan dalam file pom.xml. Biasanya terletak di folder proyek utama. Saat startup, Maven memeriksa struktur file dan sintaksis, memperingatkan Anda tentang kesalahan. Di direktori utama, di samping folder bin dan src, buat file pom.xml, tambahkan di dalamnya:
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>ru.javarush.testmaven</groupId>
  <artifactId>testMavenWithoutIde</artifactId>
  <version>1.0.0</version>

  <build>
     <defaultGoal>compile</defaultGoal>
     <sourceDirectory>src</sourceDirectory>
     <outputDirectory>bin</outputDirectory>
     <finalName>${project.artifactId}-${project.version}</finalName>
  </build>
</project>
Selanjutnya, jalankan perintah mvn pada baris perintah:

D:\Java>mvn
[INFO] Scanning for projects...
[INFO]
[INFO] -------------< ru.javarush.testmaven:testMavenWithoutIde >--------------
[INFO] Building testMavenWithoutIde 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ testMavenWithoutIde ---
[WARNING] Using platform encoding (Cp1251 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\Java\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ testMavenWithoutIde ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1251, i.e. build is platform dependent!
[INFO] Compiling 2 source files to D:\Java\bin
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.521 s
[INFO] Finished at: 2019-06-25T20:18:05+03:00
[INFO] ------------------------------------------------------------------------
Sekarang ada folder src di folder bin yang berisi kelas-kelas yang dikompilasi. Di pom.xml, tag build mendefinisikan tujuan build - kompilasi, direktori kode sumber dan file hasil kompilasi, serta nama proyek. Maven memiliki beragam target pembangunan dan plugin untuk menjalankan pengujian, membuat file Jar, membangun distribusi, dan tugas lainnya.

Gradle

Ini adalah sistem build termuda yang didasarkan pada Ant dan Maven. Perbedaan utamanya adalah ia bekerja berdasarkan grafik asiklik untuk menentukan urutan tugas. Ini sangat berguna untuk tugas-tugas yang lebih kompleks, seperti pembangunan inkremental dan multi-proyek. Saat membangun dengan Gradle, disarankan juga untuk tetap menggunakan struktur folder proyek Maven. Omong-omong, file untuk membangun di Gradle disebut build.gradle dan terlihat jauh lebih kecil dibandingkan file Maven. Contoh untuk kelas kami:
apply plugin: 'java'
apply plugin: 'application'

sourceSets {
   main {
       java {
           srcDirs 'src'
       }
   }
}
sourceSets.main.output.classesDir = file("bin")

mainClassName = "src.BoxMachine"

defaultTasks 'compileJava', 'run'
File tersebut menyertakan plugin, menentukan direktori file kode sumber (jika struktur proyek Maven tidak digunakan), direktori hasil build, nama kelas utama, dan tugas default. Perintah gradle di direktori tempat file build.gradle berada bertanggung jawab untuk memulai build:

d:\Java>D:\Temp\gradle\bin\gradle

Welcome to Gradle 5.4.1!

Here are the highlights of this release:
 - Run builds with JDK12
 - New API for Incremental Tasks
 - Updates to native projects, including Swift 5 support

For more details see https://docs.gradle.org/5.4.1/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

> Task :help

Welcome to Gradle 5.4.1.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org

BUILD SUCCESSFUL in 52s
1 actionable task: 1 executed

Kesimpulan

Sekilas, kemampuan mengkompilasi dan merakit kode tanpa IDE sepertinya tidak ada gunanya. Memang, mengapa repot-repot dengan baris perintah dan Google semua perintah ketika ada IDE yang nyaman dengan plugin, pemeriksaan otomatis segala sesuatu yang mungkin (IDE modern tidak memeriksa tingkat IQ) dan integrasi dengan sistem populer. Namun, praktik menunjukkan bahwa kemampuan untuk merakit kode tanpa lingkungan pengembangan dan memahami setiap langkah proses ini merupakan kebutuhan yang mendesak. Keterampilan ini akan menghemat banyak sel saraf dan waktu untuk Anda dan perusahaan Anda. Anda dapat mempelajari cara menggunakan IDE, berlatih menulis kode, dan tentu saja, mempelajari dasar-dasar pemrograman Java di sini - di JavaRush. Saatnya kembali belajar :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION