JavaRush /Blog Java /Random-VI /Biên dịch bằng Java

Biên dịch bằng Java

Xuất bản trong nhóm
Lập trình trong IDE rất tuyệt: sự gắn kết của các phần phụ thuộc mã, gỡ lỗi thuận tiện, kiểm tra rõ ràng, chủ đề tối. Vì vậy, nhờ IDE, sự phát triển đang phát triển nhảy vọt. Nhưng cô ấy thư giãn. Hàng ngày, khi đắm mình vào chức năng của IDE, nhà phát triển đã quen với việc thực hiện bằng một nút hoặc xây dựng bằng hai lần nhấp chuột. Biên dịch bằng Java - 1Tình hình còn tồi tệ hơn nhiều với những người mới bắt đầu lập trình làm việc trong IDE ngay từ đầu, bỏ qua công việc trên dòng lệnh. Ví dụ: trong Intellij IDEA, quá trình biên dịch ứng dụng Java được thể hiện bằng thanh tải ở bảng dưới cùng và tất cả các tham số biên dịch, xử lý đường dẫn lớp và các thú vui khác của cuộc sống Java vẫn ở phía sau. Chúng tôi khuyên bạn nên nói về việc biên dịch bằng Java mà không cần IDE. Để chạy các ví dụ trong bài viết này, hãy đảm bảo rằng JDK 1.7 trở lên được cài đặt trên máy của bạn.

Làm thế nào để biên dịch một chương trình?

Biên dịch trong lập trình là việc rút gọn mã nguồn thành mã byte cho lần khởi động chương trình tiếp theo. Chuỗi hành động từ mã nguồn đến khởi chạy chương trình trông như sau:
  1. Có mã nguồn trong một tệp có tên ClassName.java;
  2. Nếu không có lỗi trong mã, nó sẽ được biên dịch thành mã byte (trong tệp ClassName.class);
  3. Chương trình bắt đầu.
Thông thường, mỗi chương trình được chứa trong một thư mục riêng. Một ví dụ đơn giản, hãy đưa đầu ra ra bàn điều khiển:
class Test {
   public static void main(String[] args) {
      System.out.println("Это говорит приложение из командной строки");
   }
}

Lệnh javac dùng để làm gì?

Được rồi, điểm đầu tiên đã xong. Chúng ta hãy đi sâu hơn để hiểu: biên dịch như thế nào? :) Lệnh javac sẽ giúp chúng ta điều này, đối số của lệnh này phải chỉ ra tệp được yêu cầu:

javac Test.java
Nếu không có lỗi trong mã, tệp Test.class sẽ xuất hiện bên cạnh tệp Test.java. Đây là mã byte được biên dịch. Bây giờ nó cần phải được đưa ra. Ở đây chúng tôi sử dụng lệnh java để chạy mã byte: Biên dịch bằng Java - 2Ảnh chụp màn hình cho thấy chúng tôi nhận được một số chữ tượng hình ở đầu ra: rõ ràng đây là một bảng mã bị hỏng. Thông thường điều này xảy ra trên hệ thống Windows. Để hiển thị chính xác bảng chữ cái Cyrillic trong bảng điều khiển, có các lệnh sau:

REM change CHCP to UTF-8
CHCP 65001
CLS
Chúng thay đổi trang mã shell hiện tại trong suốt thời gian của cửa sổ hiện tại. Hãy thử lại lần nữa:

D:\Java>java Test
Đây là những gì ứng dụng nói từ dòng lệnh. Biết cách hoạt động của lệnh javac là rất hữu ích vì lệnh này là nền tảng của bất kỳ hệ thống xây dựng dự án nào.

Biên dịch và chạy nhiều lớp

Để làm việc với nhiều lớp, bạn cần có đường dẫn lớp. Nó tương tự như một hệ thống tệp trong đó chứa các lớp và các gói hoạt động như các thư mục. Tại thời điểm này, bạn nên suy nghĩ về việc tách các tệp mã nguồn khỏi các tệp đã biên dịch. Theo quy định, các nguồn nằm trong thư mục src và các lớp được biên dịch nằm trong bin. Ví dụ: chúng ta có một lớp Boxvà một lớp BoxMachinechứa phương thức main. Lớp học Box:
package src;

public class Box {
   private double size;

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

   public String toString() {
       return "Box have size " + size;
   }
}
Nó nằm trong gói src và cần được sửa. Lớp học 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));
       }
   }
}
Lớp này cũng được tìm thấy trong gói src. Trong phương thức này main, nó tạo ra năm đối tượng lớp Boxcó kích thước khác nhau và hiển thị thông tin về chúng trên bảng điều khiển. Để biên dịch nhóm lớp này, bạn cần sử dụng lệnh javac từ thư mục chính (chứa thư mục src và bin) với các đối số:

javac -d bin ./src/*
-d— một lá cờ mà sau đó bạn phải chỉ ra vị trí mà các lớp đã biên dịch sẽ đến. Điều này rất thuận tiện, vì việc chuyển 1000 lớp chẳng hạn là một quá trình tốn rất nhiều công sức. bin- tên thư mục. ./src/*- vị trí của các tập tin nguồn. *chỉ ra rằng tất cả các tập tin phải được biên dịch. Bây giờ các lớp đã biên dịch sẽ xuất hiện trong thư mục bin. Để chạy chúng, hãy sử dụng lệnh java từ cùng thư mục, cũng với các đối số:

java -classpath ./bin BoxMachine
-classpath— một lá cờ mà sau đó bạn phải chỉ ra vị trí của các lớp đã biên dịch. Java sẽ tìm lớp chính và tất cả các lớp liên quan trong thư mục này. ./bin— tên của thư mục chứa các lớp đã biên dịch. BoxMachine- tên của lớp chính. Như trong trường hợp đầu tiên, không nên chỉ định .classvì đây là tên của một lớp chứ không phải một tệp. Phần kết luận:

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

Tạo tập tin JAR

Để làm cho chương trình dễ dàng chuyển và chạy, bạn có thể tập hợp các lớp đã biên dịch vào một tệp jar - một kho lưu trữ lớp. Sự khác biệt chính so với kho lưu trữ zip hoặc rar là sự hiện diện của tệp kê khai. Tệp kê khai này chỉ định lớp chính sẽ được chạy khi tệp jar được thực thi, đường dẫn lớp và nhiều thông tin bổ sung. Hãy tạo một tệp kê khai.mf trong thư mục chính. Nội dung của nó sẽ như sau:

main-class: src.BoxMachine
class-path: bin/
main-classchỉ định lớp chứa phương thức mainvà sẽ được thực thi khi khởi động. class-path— đường dẫn đến các lớp đã biên dịch hoặc các thư viện bổ sung. Bây giờ là lúc xây dựng một chương trình thực sự không có IDE bằng lệnh jar:

jar -cmf manifest.mf box-machine.jar  -C bin .
-cmf— một lá cờ mà sau đó bạn nên chỉ định đường dẫn đến tệp kê khai. manifest.mf- đường dẫn đến bảng kê khai. box-machine.jar- tên của tệp jar đầu ra. — một lá cờ sau đó chỉ ra đường dẫn đến các lớp đã biên dịch. .— đường dẫn nơi tệp jar sẽ được đặt. Trong trường hợp của chúng tôi, đây là thư mục chính. Bây giờ bạn có thể khởi chạy. Việc khởi chạy tệp jar cũng được thực hiện bằng lệnh java, nhưng sau đó bạn cần chỉ định cờ -jar: nó cho biết tệp Jar đang được khởi chạy và đối số thứ hai là đường dẫn đến jartệp, bao gồm cả phần mở rộng :

java -jar box-machine.jar
Phần kết luận:

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

Biên dịch bằng Java không có IDE: Tổng quan về Hệ thống xây dựng

Mặc dù dòng lệnh tương đối dễ sử dụng nhưng rất khó để xây dựng các dự án vừa và lớn bằng cách sử dụng nó. Việc này tốn rất nhiều thời gian và có nhiều sai sót ở các mức độ khác nhau. May mắn thay, có những hệ thống lắp ráp giúp quá trình làm việc trở nên dễ dàng hơn nhiều. Với một số nhóm, hệ thống này có thể tập hợp một dự án có độ phức tạp bất kỳ và lượng plugin dồi dào được tạo ra trong quá trình tồn tại của các hệ thống như vậy có thể loại bỏ hầu hết mọi vấn đề đau đầu.

Làm thế nào để biên dịch Java?

Các hệ thống xây dựng Java nổi tiếng nhất là Ant, Maven và Gradle. Không có tốt hay xấu: mỗi cái đều được tạo ra để giải quyết những vấn đề nhất định. Chúng ta hãy xem xét từng người trong số họ chi tiết hơn.

Con kiến

Ant là một công cụ xây dựng sử dụng tập lệnh được mô tả bằng tệp xml. cấu trúc tệp xml:
<?xml version="1.0"?>
<project name="NameПроекта" default="сценарийПоУмолчанию">
    <target name="NameСценария">
  //  Действия сценария
        <echo>Hello, World!</echo>
    </target>
  //  Второй сценарий
  //  И тд
</project>
Hãy tạo một tệp build.xml trong thư mục chính với nội dung sau:
<?xml version="1.0"?>
<project name="BoxMachine" default="test">
   <target name="test">
       <echo>First build in Ant!</echo>
   </target>
</project>
Trong cùng thư mục, gọi lệnh 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
Thẻ <target>có thể chỉ định các tác vụ khác nhau cho phép bạn quản lý hệ thống tập tin và tập hợp. Ant có sẵn hơn 150 lệnh được liệt kê trong tài liệu. Trong ví dụ dưới đây chúng tôi chỉ sử dụng 5:
  • mkdir - tạo thư mục
  • delete- xóa tập tin và thư mục
  • javac- Biên dịch mã Java
  • java- chạy mã được biên dịch
Một tập lệnh biên dịch, xây dựng hoặc dọn dẹp đơn giản trông như thế này:
<?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>
Kịch bản mô tả ba hành động - compile, ,code>run và clean. compiletạo một thư mục kết quả có các lớp trong đó, sau đó sử dụng javac để biên dịch các lớp vào thư mục đã tạo. runchạy các lớp đã biên dịch bằng lệnh java. cleanxóa thư mục kết quả. Nếu bạn chạy lệnh ant trong thư mục chính mà không có bất kỳ đối số nào thì hành động biên dịch sẽ chạy. Nếu một hành động cụ thể cần được thực hiện, nó sẽ được chỉ định trong đối số.

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 đưa ra một cách tiếp cận hơi khác để xây dựng các dự án. Ở đây, nhà phát triển mô tả dự án của mình và các công cụ bổ sung mà anh ta sử dụng, không giống như Ant, nơi bản dựng là một chuỗi hành động. Maven được các nhà phát triển ưa chuộng do quản lý phụ thuộc dễ dàng và tích hợp thuận tiện với tất cả các môi trường phát triển. Khi làm việc với Maven, chúng tôi tuân thủ cấu trúc dự án sau: Biên dịch bằng Java - 3Các quy tắc xây dựng, phần phụ thuộc, v.v. được mô tả trong tệp pom.xml. Thông thường nó nằm trong thư mục dự án chính. Khi khởi động, Maven kiểm tra cấu trúc và cú pháp tệp, cảnh báo bạn về lỗi. Trong thư mục chính, bên cạnh thư mục bin và src tạo file pom.xml, thêm vào bên trong:
<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>
Tiếp theo, chạy lệnh mvn trên dòng lệnh:

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] ------------------------------------------------------------------------
Bây giờ có một thư mục src trong thư mục bin chứa các lớp đã biên dịch. Trong pom.xml, thẻ build xác định mục đích của quá trình biên dịch - xây dựng, các thư mục của mã nguồn và tệp kết quả biên dịch, cũng như tên dự án. Maven có nhiều mục tiêu xây dựng và plugin khác nhau để chạy thử nghiệm, tạo tệp Jar, xây dựng bản phân phối và các tác vụ khác.

Lớp

Đây là hệ thống xây dựng trẻ nhất dựa trên Ant và Maven. Sự khác biệt chính là nó hoạt động trên cơ sở biểu đồ chu kỳ để xác định thứ tự các nhiệm vụ. Điều này rất hữu ích cho các tác vụ phức tạp hơn, chẳng hạn như các bản dựng tăng dần và nhiều dự án. Khi xây dựng bằng Gradle, bạn cũng nên tuân theo cấu trúc thư mục dự án Maven. Nhân tiện, tệp xây dựng trong Gradle có tên là build.gradle và trông nhỏ hơn nhiều so với tệp của Maven. Ví dụ cho các lớp học của chúng tôi:
apply plugin: 'java'
apply plugin: 'application'

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

mainClassName = "src.BoxMachine"

defaultTasks 'compileJava', 'run'
Tệp chứa các plugin, định nghĩa của thư mục tệp mã nguồn (nếu cấu trúc dự án Maven không được sử dụng), thư mục kết quả xây dựng, tên của lớp chính và các tác vụ mặc định. Lệnh gradle trong thư mục chứa tệp build.gradle chịu trách nhiệm bắt đầu quá trình xây dựng:

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

Phần kết luận

Thoạt nhìn, khả năng biên dịch và lắp ráp mã mà không cần IDE có vẻ vô dụng. Thật vậy, tại sao phải bận tâm đến các dòng lệnh và Google tất cả các lệnh khi có một IDE ấm cúng với các plugin, tự động kiểm tra mọi thứ có thể (các IDE hiện đại không kiểm tra mức IQ) và tích hợp với các hệ thống phổ biến. Tuy nhiên, thực tế cho thấy khả năng lắp ráp mã mà không cần môi trường phát triển và hiểu rõ từng bước của quy trình này là vô cùng cần thiết. Kỹ năng này sẽ tiết kiệm rất nhiều tế bào thần kinh và thời gian cho bạn và công ty của bạn. Bạn có thể tìm hiểu cách sử dụng IDE, thực hành viết mã và tất nhiên có được những kiến ​​thức cơ bản về lập trình Java tại đây - tại JavaRush. Đã đến lúc quay lại học tập :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION