JavaRush /Java Blog /Random-KO /자바에서 컴파일하기

자바에서 컴파일하기

Random-KO 그룹에 게시되었습니다
IDE에서의 프로그래밍은 코드 종속성의 일관성, 편리한 디버깅, 명확한 테스트, 어두운 테마 등 훌륭합니다. 따라서 IDE 덕분에 개발은 비약적으로 발전하고 있습니다. 그러나 그녀는 긴장을 풀었습니다. 매일 IDE의 기능에 몰입하면서 개발자는 버튼 하나로 커밋하거나 두 번의 클릭으로 구축하는 데 익숙해집니다. Java로 컴파일하기 - 1명령줄 작업을 무시하고 처음부터 IDE에서 작업하는 프로그래밍 초보자의 경우 상황은 훨씬 더 나쁩니다. 예를 들어 Intellij IDEA에서 Java 애플리케이션 컴파일은 하단 패널의 로딩 표시줄로 시연되며 모든 컴파일 매개변수, 클래스 경로 처리 및 기타 Java 생활의 즐거움은 그 뒤에 남아 있습니다. IDE 없이 Java로 컴파일하는 것에 대해 이야기하는 것이 좋습니다. 이 문서의 예제를 실행하려면 JDK 1.7 이상이 컴퓨터에 설치되어 있는지 확인하세요.

프로그램을 컴파일하는 방법은 무엇입니까?

프로그래밍에서의 컴파일은 프로그램의 후속 시작을 위해 소스 코드를 바이트코드로 줄이는 것입니다. 소스 코드에서 프로그램 실행까지의 동작 순서는 다음과 같습니다.
  1. ClassName.java라는 파일에 소스 코드가 있습니다.
  2. 코드에 오류가 없으면 바이트코드로 컴파일됩니다(ClassName.class 파일에 있음).
  3. 프로그램이 시작됩니다.
일반적으로 각 프로그램은 별도의 디렉터리에 포함되어 있습니다. 간단한 예로 출력을 콘솔로 가져가겠습니다.
class Test {
   public static void main(String[] args) {
      System.out.println("Это говорит приложение из командной строки");
   }
}

javac 명령은 무엇에 사용됩니까?

좋아요, 첫 번째 요점이 완료되었습니다. 이해하기 위해 더 나아가 보겠습니다. 컴파일 방법은 무엇입니까? :) javac 명령은 이에 대해 도움이 될 것입니다. 이 명령의 인수는 필수 파일을 지정해야 합니다.

javac Test.java
코드에 오류가 없으면 Test.class 파일이 Test.java 파일 옆에 나타납니다. 컴파일된 바이트코드입니다. 이제 실행해야 합니다. 여기서는 바이트코드를 실행하는 java 명령을 사용합니다. Java로 컴파일하기 - 2스크린샷은 출력에서 ​​일부 상형 문자를 얻는 것을 보여줍니다. 분명히 이것은 깨진 인코딩입니다. 일반적으로 이는 Windows 시스템에서 발생합니다. 콘솔에 키릴 문자를 올바르게 표시하려면 다음 명령이 있습니다.

REM change CHCP to UTF-8
CHCP 65001
CLS
현재 창 기간 동안 현재 쉘 코드 페이지를 변경합니다. 다시 해보자:

D:\Java>java Test
이는 애플리케이션이 명령줄에서 말하는 내용입니다. javac 명령이 어떻게 작동하는지 아는 것은 매우 유용합니다. 왜냐하면 이 명령은 모든 프로젝트 빌드 시스템의 기초이기 때문입니다.

여러 클래스 컴파일 및 실행

여러 클래스로 작업하려면 클래스 경로가 필요합니다. 클래스가 포함되어 있고 패키지가 폴더 역할을 하는 파일 시스템과 유사합니다. 이 시점에서는 컴파일된 파일에서 소스 코드 파일을 분리하는 것을 고려해 볼 가치가 있습니다. 일반적으로 소스는 src 디렉터리에 있고 컴파일된 클래스는 bin에 있습니다. 예를 들어, 클래스 와 메소드를 포함하는 Box클래스가 있습니다 . 수업 : BoxMachinemainBox
package src;

public class Box {
   private double size;

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

   public String toString() {
       return "Box have size " + size;
   }
}
src 패키지에 있으며 수정이 필요합니다. 수업 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));
       }
   }
}
이 클래스는 src 패키지에도 있습니다. 메서드에서는 크기가 다른 main5개의 클래스 개체를 만들고 Box해당 개체에 대한 정보를 콘솔에 표시합니다. 이 클래스 그룹을 컴파일하려면 기본 디렉터리(src 및 bin 폴더 포함)에서 javac 명령을 인수와 함께 사용해야 합니다.

javac -d bin ./src/*
-d— 컴파일된 클래스가 이동할 위치를 표시해야 하는 플래그입니다. 예를 들어 1000개의 클래스를 이전하는 것은 매우 노동 집약적인 프로세스이기 때문에 이는 매우 편리합니다. bin- 폴더 이름. ./src/*— 소스 파일의 위치. *모든 파일을 컴파일해야 함을 나타냅니다. 이제 컴파일된 클래스가 bin 폴더에 나타납니다. 이를 실행하려면 동일한 디렉터리에서 인수와 함께 java 명령을 사용합니다.

java -classpath ./bin BoxMachine
-classpath— 컴파일된 클래스의 위치를 ​​표시해야 하는 플래그입니다. Java는 이 디렉터리에서 기본 클래스와 관련된 모든 클래스를 찾습니다. ./bin— 컴파일된 클래스가 있는 폴더의 이름입니다. BoxMachine— 메인 클래스의 이름. 첫 번째 경우와 마찬가지로 .class파일이 아닌 클래스 이름이므로 지정해서는 안 됩니다. 결론:

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

JAR 파일 생성

프로그램을 쉽게 이식하고 실행할 수 있도록 컴파일된 클래스를 클래스 아카이브인 jar 파일로 수집할 수 있습니다. zip 또는 rar 아카이브와의 주요 차이점은 매니페스트 파일이 있다는 것입니다. 이 매니페스트는 jar 파일이 실행될 때 실행될 기본 클래스, 클래스 경로 및 많은 추가 정보를 지정합니다. 기본 디렉터리에 Manifest.mf 파일을 생성해 보겠습니다. 그 내용은 다음과 같습니다:

main-class: src.BoxMachine
class-path: bin/
main-classmain메소드를 포함 하고 시작 시 실행될 클래스를 지정합니다 . class-path— 컴파일된 클래스 또는 추가 라이브러리의 경로입니다. 이제 jar 명령을 사용하여 IDE 없이 실제 프로그램을 빌드할 차례입니다.

jar -cmf manifest.mf box-machine.jar  -C bin .
-cmf— 매니페스트 파일의 경로를 지정해야 하는 플래그입니다. manifest.mf— 매니페스트의 경로입니다. box-machine.jar— 출력 jar 파일의 이름입니다. — 컴파일된 클래스의 경로가 표시된 플래그입니다. .— jar 파일이 배치될 경로입니다. 우리의 경우 이것이 기본 디렉터리입니다. 이제 시작할 수 있습니다. jar 파일 실행은 java 명령을 사용하여 수행되지만 플래그를 지정해야 합니다 -jar. 이는 Jar 파일이 실행되고 있음을 나타내고 두 번째 인수는 확장자를 포함한 파일 경로jar 입니다 .

java -jar box-machine.jar
결론:

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

IDE 없이 Java로 컴파일: 빌드 시스템 개요

명령줄의 상대적 사용 용이성에도 불구하고 이를 사용하여 중대형 프로젝트를 구축하는 것은 매우 어렵습니다. 이 작업에는 많은 시간이 걸리며 다양한 정도의 오류가 발생합니다. 다행스럽게도 작업 프로세스를 훨씬 쉽게 만들어주는 조립 시스템이 있습니다. 여러 팀으로 구성된 이 시스템은 복잡한 프로젝트를 구성할 수 있으며, 이러한 시스템이 존재하는 동안 생성된 풍부한 플러그인은 거의 모든 문제를 해결할 수 있습니다.

Java를 컴파일하는 방법?

가장 유명한 Java 빌드 시스템은 Ant, Maven 및 Gradle입니다. 좋은 것도 나쁜 것도 없습니다. 각각은 특정 문제를 해결하기 위해 만들어졌습니다. 각각을 더 자세히 살펴보겠습니다.

개미

Ant는 xml 파일을 사용하여 설명된 스크립트를 사용하는 빌드 도구입니다. xml 파일 구조:
<?xml version="1.0"?>
<project name="NameПроекта" default="сценарийПоУмолчанию">
    <target name="NameСценария">
  //  Действия сценария
        <echo>Hello, World!</echo>
    </target>
  //  Второй сценарий
  //  И тд
</project>
다음 내용으로 기본 디렉터리에 build.xml 파일을 만들어 보겠습니다.
<?xml version="1.0"?>
<project name="BoxMachine" default="test">
   <target name="test">
       <echo>First build in Ant!</echo>
   </target>
</project>
동일한 디렉터리에서 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
태그는 <target>어셈블리와 파일 시스템을 관리할 수 있는 다양한 작업을 지정할 수 있습니다. Ant에는 문서에 나열된 150개 이상의 명령이 있습니다. 아래 예에서는 5개만 사용합니다.
  • mkdir - 디렉토리 생성
  • delete- 파일 및 디렉토리 삭제
  • javac- 자바 코드 컴파일
  • java- 컴파일된 코드 실행
간단한 컴파일, 빌드 또는 정리 스크립트는 다음과 같습니다.
<?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>
이 스크립트는 , compile,code>run 및 의 세 가지 작업을 설명합니다 clean. compile클래스가 포함된 결과 디렉터리를 생성한 다음 javac를 사용하여 클래스를 생성된 디렉터리로 컴파일합니다. runjava 명령으로 컴파일된 클래스를 실행합니다. clean결과 디렉터리를 삭제합니다. 기본 디렉터리에서 인수 없이 ant 명령을 실행하면 컴파일 작업이 실행됩니다. 특정 작업을 수행해야 하는 경우 인수에 지정됩니다.

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은 프로젝트 구축에 대해 약간 다른 접근 방식을 제공합니다. 여기서 개발자는 빌드가 일련의 작업인 Ant와 달리 자신의 프로젝트와 그가 사용하는 추가 도구를 설명합니다. Maven은 쉬운 종속성 관리와 모든 개발 환경과의 편리한 통합으로 인해 개발자들 사이에서 인기가 높습니다. Maven으로 작업할 때 우리는 다음과 같은 프로젝트 구조를 따릅니다. Java로 컴파일하기 - 3빌드 규칙, 종속성 등은 pom.xml 파일에 설명되어 있습니다. 일반적으로 기본 프로젝트 폴더에 있습니다. 시작 시 Maven은 파일 구조와 구문을 확인하여 오류에 대해 경고합니다. 기본 디렉터리의 bin 및 src 폴더 옆에 pom.xml 파일을 만들고 내부에 다음을 추가합니다.
<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>
다음으로 명령줄에서 mvn 명령을 실행합니다.

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] ------------------------------------------------------------------------
이제 컴파일된 클래스가 있는 bin 폴더에 src 폴더가 있습니다. pom.xml에서 빌드 태그는 빌드 목적(컴파일), 소스 코드 디렉터리 및 컴파일 결과 파일, 프로젝트 이름을 정의합니다. Maven에는 테스트 실행, Jar 파일 생성, 배포판 구축 및 기타 작업을 위한 다양한 빌드 대상과 플러그인이 있습니다.

그래들

Ant와 Maven을 기반으로 한 최신 빌드 시스템입니다. 주요 차이점은 작업 순서를 결정하기 위해 비순환 그래프를 기반으로 작동한다는 것입니다. 이는 증분 및 다중 프로젝트 빌드와 같은 보다 복잡한 작업에 매우 유용합니다. Gradle로 빌드할 때 Maven 프로젝트 폴더 구조를 고수하는 것도 권장됩니다. 그런데 Gradle에서 빌드하기 위한 파일은 build.gradle이라고 하는데 Maven에 비해 훨씬 작아 보입니다. 우리 수업의 예:
apply plugin: 'java'
apply plugin: 'application'

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

mainClassName = "src.BoxMachine"

defaultTasks 'compileJava', 'run'
파일에는 플러그인이 포함되어 있으며 소스 코드 파일 디렉터리(Maven 프로젝트 구조를 사용하지 않는 경우), 빌드 결과 디렉터리, 기본 클래스 이름 및 기본 작업을 정의합니다. build.gradle 파일이 있는 디렉터리의 gradle 명령은 빌드 시작을 담당합니다.

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

결론

언뜻 보면 IDE 없이 코드를 컴파일하고 어셈블하는 기능은 쓸모없어 보입니다. 실제로, 플러그인이 포함된 편리한 IDE, 가능한 모든 항목의 자동 확인(최신 IDE는 IQ 수준을 확인하지 않음) 및 인기 시스템과의 통합이 있는데 왜 명령줄과 Google의 모든 명령으로 귀찮게 해야 할까요? 그러나 실제로는 개발 환경 없이 코드를 조합하고 이 프로세스의 모든 단계를 이해하는 능력이 절실히 필요하다는 것을 보여줍니다. 이 기술은 귀하와 귀하의 회사를 위해 많은 신경 세포와 시간을 절약해 줄 것입니다. JavaRush에서 IDE 사용 방법을 배우고, 코드 작성을 연습하고, Java 프로그래밍의 기본 사항을 얻을 수 있습니다. 다시 배움의 시간을 가져보세요 :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION