JavaRush /Java Blog /Random-JA /Javaでコンパイルする

Javaでコンパイルする

Random-JA グループに公開済み
IDE でのプログラミングは素晴らしいものです。コードの依存関係の一貫性、便利なデバッグ、明確なテスト、ダーク テーマなどです。つまり、IDE のおかげで開発は飛躍的に進んでいます。しかし、彼女はリラックスします。開発者は毎日 IDE の機能に没頭することで、ボタン 1 つでコミットしたり、クリック 2 つでビルドしたりすることに慣れてきます。 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 パッケージにもあります。メソッド ではmain、サイズの異なる 5 つのクラス オブジェクトを作成し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 ファイルが起動されていることを示し、2 番目の引数は拡張子を含むファイルへのパス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コードのコンパイル
  • 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 、 の3 つのアクションが記述されていますcleancompileクラスを含む結果ディレクトリを作成し、javac を使用してクラスを作成されたディレクトリにコンパイルします。 runコンパイルされたクラスを java コマンドで実行します。 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 の build タグは、ビルドの目的 (コンパイル)、ソース コードとコンパイル結果ファイルのディレクトリ、およびプロジェクト名を定義します。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 は IQ レベルをチェックしません)、および一般的なシステムとの統合を備えた快適な IDE があるのに、なぜわざわざコマンド ラインを使用したり、すべてのコマンドを Google で調べたりする必要があるのでしょうか。ただし、実践してみると、開発環境なしでコードをアセンブルし、このプロセスのすべてのステップを理解する能力が緊急に必要であることがわかります。このスキルは、あなたとあなたの会社の多くの神経細胞と時間を節約します。JavaRush では、IDE の使用方法を学び、コードの作成を練習し、もちろん Java プログラミングの基礎を学ぶことができます。学習に戻る時間です:)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION