Java プロジェクト構造の管理方法

JavaBeginner
オンラインで実践に進む

はじめに

効果的なプロジェクト構造は、Java 開発の成功に欠かせない要素です。この包括的なガイドでは、Java プロジェクトを整理する基本原則を探求し、開発者に拡張性があり、保守しやすく、構造が良好なソフトウェアソリューションを作成するための実践的な知見を提供します。

基本的な Java プロジェクト構造の作成

Java プロジェクトは、開発者がコードを効果的に管理するのに役立つ特定の組織化規則に従います。このステップでは、基本的なコンポーネントを理解するために、手動でシンプルな Java プロジェクト構造を作成します。

Java プロジェクトのコンポーネントの理解

Java プロジェクトは通常、以下の要素を含みます。

  • ソースコードファイル(.java
  • コンパイルされたバイトコードファイル(.class
  • リソースファイル(設定ファイル、画像など)
  • ドキュメント

シンプルなプロジェクト構造の作成

まず、ワークスペースに基本的なプロジェクト構造を作成しましょう。概念を説明するために、シンプルな "HelloWorld" アプリケーションを構築します。

  1. まず、LabEx 環境でターミナルを開きます。ターミナルはすでに /home/labex/project ディレクトリにあるはずです。

  2. Java アプリケーション用のプロジェクトディレクトリを作成します。

mkdir -p hello-java-app/src
cd hello-java-app
  1. src ディレクトリ内に、シンプルな Java クラスファイルを作成するためのディレクトリを作成します。
mkdir -p src/com/example/app
  1. 次に、最初の Java クラスを作成しましょう。コードエディタを開き、hello-java-app/src/com/example/app/ パスに HelloWorld.java という新しいファイルを作成します。
package com.example.app;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java Project World!");
    }
}
  1. この Java コードをコンパイルしましょう。ターミナルでプロジェクトのルートディレクトリに戻り、以下のコマンドを実行します。
cd /home/labex/project/hello-java-app
mkdir -p bin
javac -d bin src/com/example/app/HelloWorld.java

コンパイルが成功した場合、出力にはエラーが表示されないはずです。

  1. 次に、コンパイルされた Java アプリケーションを実行します。
java -cp bin com.example.app.HelloWorld

以下の出力が表示されるはずです。

Hello, Java Project World!

プロジェクト構造の理解

作成したものを見てみましょう。

hello-java-app/
├── bin/              ## コンパイルされたバイトコード(.class ファイル)
│   └── com/
│       └── example/
│           └── app/
│               └── HelloWorld.class
└── src/              ## ソースコード(.java ファイル)
    └── com/
        └── example/
            └── app/
                └── HelloWorld.java

この構造は以下の原則に従っています。

  • ソースコードの分離:すべての Java ソースファイルは src ディレクトリにあります。
  • パッケージ構造com.example.app パッケージは com/example/app/ ディレクトリに対応しています。
  • コンパイル済みコードの分離:バイトコードファイルは別の bin ディレクトリにあります。

重要な概念

  • パッケージ:Java はクラスを整理し、名前の衝突を避けるためにパッケージを使用します。
  • ディレクトリ構造:パッケージ名は直接ディレクトリ構造に対応します。
  • クラスパス-cp フラグは、Java にコンパイルされたクラスをどこで見つけるかを指示します。

これで、基本的な Java プロジェクト構造を手動で作成しました。この基礎は、実際のアプリケーションで使用されるより複雑なプロジェクト構造を理解するのに役立ちます。

パッケージを使用した Java コードの整理

このステップでは、パッケージを使用して Java コードを整理し、複数のクラスを持つより構造化されたアプリケーションを作成する方法を学びます。適切なパッケージの整理は、保守可能な Java プロジェクトに不可欠です。

パッケージの命名規則の理解

Java のパッケージは階層的な命名規則に従います。

  • ドメイン名を逆順にして始めます(例:com.example
  • プロジェクトまたは組織名を追加します(例:com.example.project
  • 機能領域を追加します(例:com.example.project.model

この構造を私たちのプロジェクトに実装しましょう。

複数パッケージのプロジェクトの作成

異なる関心事に対して別々のパッケージを持つシンプルな図書館管理システムを構築します。

  1. プロジェクトディレクトリに移動します。
cd /home/labex/project
mkdir -p library-app/src
cd library-app
  1. 構造化されたパッケージレイアウトを作成します。
mkdir -p src/com/example/library/model
mkdir -p src/com/example/library/service
mkdir -p src/com/example/library/util
  1. まず、モデルクラスを作成します。コードエディタを開き、library-app/src/com/example/library/model/ パスに Book.java という新しいファイルを作成します。
package com.example.library.model;

public class Book {
    private String title;
    private String author;
    private int year;

    public Book(String title, String author, int year) {
        this.title = title;
        this.author = author;
        this.year = year;
    }

    // Getters
    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public int getYear() {
        return year;
    }

    @Override
    public String toString() {
        return "Book{title='" + title + "', author='" + author + "', year=" + year + "}";
    }
}
  1. 次に、library-app/src/com/example/library/service/BookService.java にサービスクラスを作成します。
package com.example.library.service;

import com.example.library.model.Book;
import java.util.ArrayList;
import java.util.List;

public class BookService {
    private List<Book> books = new ArrayList<>();

    public void addBook(Book book) {
        books.add(book);
    }

    public List<Book> getAllBooks() {
        return new ArrayList<>(books);
    }

    public Book findBookByTitle(String title) {
        for (Book book : books) {
            if (book.getTitle().equalsIgnoreCase(title)) {
                return book;
            }
        }
        return null;
    }
}
  1. library-app/src/com/example/library/util/BookFormatter.java にユーティリティクラスを作成します。
package com.example.library.util;

import com.example.library.model.Book;

public class BookFormatter {
    public static String formatBookInfo(Book book) {
        return String.format("'%s' by %s (%d)",
            book.getTitle(), book.getAuthor(), book.getYear());
    }
}
  1. 最後に、library-app/src/com/example/library/LibraryApp.java にメインアプリケーションクラスを作成します。
package com.example.library;

import com.example.library.model.Book;
import com.example.library.service.BookService;
import com.example.library.util.BookFormatter;

public class LibraryApp {
    public static void main(String[] args) {
        // Create service
        BookService bookService = new BookService();

        // Add some books
        bookService.addBook(new Book("The Great Gatsby", "F. Scott Fitzgerald", 1925));
        bookService.addBook(new Book("To Kill a Mockingbird", "Harper Lee", 1960));
        bookService.addBook(new Book("1984", "George Orwell", 1949));

        // Display all books
        System.out.println("Library Catalog:");
        for (Book book : bookService.getAllBooks()) {
            System.out.println(BookFormatter.formatBookInfo(book));
        }

        // Find a specific book
        Book foundBook = bookService.findBookByTitle("1984");
        if (foundBook != null) {
            System.out.println("\nFound book: " + foundBook);
        }
    }
}
  1. すべての Java ファイルをコンパイルします。
mkdir -p bin
javac -d bin src/com/example/library/model/Book.java src/com/example/library/service/BookService.java src/com/example/library/util/BookFormatter.java src/com/example/library/LibraryApp.java
  1. アプリケーションを実行します。
java -cp bin com.example.library.LibraryApp

以下の出力が表示されるはずです。

Library Catalog:
'The Great Gatsby' by F. Scott Fitzgerald (1925)
'To Kill a Mockingbird' by Harper Lee (1960)
'1984' by George Orwell (1949)

Found book: Book{title='1984', author='George Orwell', year=1949}

パッケージ構造の理解

作成した構造を見てみましょう。

library-app/
├── bin/                              ## コンパイルされたバイトコード
└── src/                              ## ソースコード
    └── com/
        └── example/
            └── library/
                ├── model/            ## データ構造
                │   └── Book.java
                ├── service/          ## ビジネスロジック
                │   └── BookService.java
                ├── util/             ## ユーティリティ関数
                │   └── BookFormatter.java
                └── LibraryApp.java   ## メインアプリケーション

パッケージの整理原則

この構造は重要な設計原則に従っています。

  1. 関心事の分離

    • model パッケージ:データ構造を含みます。
    • service パッケージ:ビジネスロジックを含みます。
    • util パッケージ:ユーティリティ関数を含みます。
  2. 論理的なグルーピング:関連するクラスは同じパッケージにグループ化されています。

  3. 直感的なナビゲーション:パッケージ構造により、特定の機能を簡単に見つけることができます。

  4. インポート管理:クラスはインポートを通じて相互に参照し、依存関係が明確になります。

このようにコードを整理することで、理解しやすく拡張しやすい、より保守可能で拡張性のあるアプリケーションを作成できます。

Maven を使用したプロジェクト管理

このステップでは、Apache Maven を使用して Java プロジェクトを管理する方法を学びます。Maven は強力なビルド自動化および依存関係管理ツールで、プロジェクトのセットアップとメンテナンスを簡素化します。

Maven の理解

Maven は以下を提供します。

  • 標準的なプロジェクト構造
  • 依存関係管理
  • ビルド自動化
  • プロジェクト情報管理
  • プロジェクト間で一貫したビルドプロセス

Maven プロジェクトのセットアップ

Maven を使用して新しいプロジェクトを作成しましょう。

  1. まず、Maven がインストールされているか確認します。
mvn --version

以下のような出力が表示されるはずです。

Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.15.0-1036-azure", arch: "amd64", family: "unix"
  1. プロジェクトディレクトリに移動します。
cd /home/labex/project
  1. アーキタイプ(プロジェクトテンプレート)を使用して新しい Maven プロジェクトを作成します。
mvn archetype:generate \
  -DgroupId=com.example.calculator \
  -DartifactId=simple-calculator \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DarchetypeVersion=1.4 \
  -DinteractiveMode=false

このコマンドは、標準的なディレクトリ構造を持つ新しいプロジェクトを作成します。

  1. プロジェクト構造を確認します。
cd simple-calculator
ls -la

以下のような出力が表示されるはずです。

total 24
drwxr-xr-x 4 labex labex 4096 ... .
drwxr-xr-x 6 labex labex 4096 ... ..
-rw-r--r-- 1 labex labex  174 ... .gitignore
-rw-r--r-- 1 labex labex  720 ... pom.xml
drwxr-xr-x 4 labex labex 4096 ... src

ここで重要なファイルは pom.xml(Project Object Model)で、これがプロジェクトの設定を定義します。

  1. Maven の標準ディレクトリレイアウトを確認します。
find src -type d

以下のように表示されるはずです。

src
src/main
src/main/java
src/main/java/com
src/main/java/com/example
src/main/java/com/example/calculator
src/test
src/test/java
src/test/java/com
src/test/java/com/example
src/test/java/com/example/calculator

これが Maven の標準ディレクトリレイアウトです。

  • src/main/java:ソースコード
  • src/main/resources:リソースファイル
  • src/test/java:テストコード
  • src/test/resources:テスト用リソース
  1. 生成された App.java ファイルを見てみましょう。
cat src/main/java/com/example/calculator/App.java

シンプルな "Hello World" クラスが表示されるはずです。

package com.example.calculator;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

Maven プロジェクトの拡張

もっとクラスを追加して、計算機プロジェクトを拡張しましょう。

  1. src/main/java/com/example/calculator/Calculator.java という新しいファイルを作成します。
package com.example.calculator;

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public double divide(int a, int b) {
        if (b == 0) {
            throw new ArithmeticException("Cannot divide by zero");
        }
        return (double) a / b;
    }
}
  1. 次に、既存の App.java ファイルを変更して、Calculator クラスを使用するようにします。
package com.example.calculator;

/**
 * Simple Calculator Application
 */
public class App
{
    public static void main( String[] args )
    {
        Calculator calculator = new Calculator();

        // Perform some calculations
        System.out.println("Addition: 5 + 3 = " + calculator.add(5, 3));
        System.out.println("Subtraction: 10 - 4 = " + calculator.subtract(10, 4));
        System.out.println("Multiplication: 6 * 7 = " + calculator.multiply(6, 7));
        System.out.println("Division: 20 / 4 = " + calculator.divide(20, 4));

        System.out.println("Calculator application completed successfully!");
    }
}
  1. Maven を使用してプロジェクトをビルドします。
mvn compile

以下のような出力で終わるはずです。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
  1. アプリケーションを JAR ファイルにパッケージ化します。
mvn package

このコマンドはコードをコンパイルし、テストを実行し、アプリケーションをパッケージ化します。

  1. パッケージ化されたアプリケーションを実行します。
java -cp target/simple-calculator-1.0-SNAPSHOT.jar com.example.calculator.App

以下の出力が表示されるはずです。

Addition: 5 + 3 = 8
Subtraction: 10 - 4 = 6
Multiplication: 6 * 7 = 42
Division: 20 / 4 = 5.0
Calculator application completed successfully!

Maven の POM ファイルの理解

Project Object Model(POM)ファイルにはプロジェクトの設定が含まれています。エディタで pom.xml ファイルを開き、その構造を確認しましょう。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example.calculator</groupId>
  <artifactId>simple-calculator</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>simple-calculator</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!-- Build configuration... -->
</project>

POM ファイルの重要な要素:

  • groupId:組織またはプロジェクトの識別子
  • artifactId:プロジェクト名
  • version:プロジェクトのバージョン
  • dependencies:プロジェクトで使用される外部ライブラリ
  • build:プロジェクトのビルド設定

Maven の重要なコマンド

以下はいくつかの重要な Maven コマンドです。

  • mvn compile:ソースコードをコンパイルします。
  • mvn test:テストを実行します。
  • mvn package:配布可能なパッケージ(JAR、WAR)を作成します。
  • mvn install:パッケージをローカルリポジトリにインストールします。
  • mvn clean:ビルドアーティファクト(target ディレクトリ)を削除します。
  • mvn clean installcleaninstall の組み合わせ

Maven は、規約、依存関係管理、ビルド自動化を提供することで、Java プロジェクト管理を大幅に簡素化しました。この標準化されたアプローチにより、開発者はプロジェクト構造の管理ではなく、コードの記述に集中することができます。

まとめ

この実験では、実践を通じて Java プロジェクト構造を管理するための重要な戦略を学びました。

  1. まず、基本的な Java プロジェクト構造を手動で作成し、ソースディレクトリ、パッケージ、およびコンパイル済みコードの組織の基本的な要素を理解しました。

  2. 次に、適切なパッケージ構成を持つより複雑なプロジェクトを作成し、機能をモデル、サービス、およびユーティリティパッケージに分割することで関心事の分離を実現しました。

  3. 最後に、強力なビルド自動化ツールである Maven を使用して、依存関係管理と自動化されたビルドプロセスを備えた標準化された Java プロジェクトを作成および管理する方法を学びました。

これらの基礎的なスキルは、将来の Java 開発作業の堅固な基盤となり、整理された、保守可能で拡張性のあるアプリケーションを作成することができます。プロジェクト構造に関する既存の規約とベストプラクティスに従うことで、他の開発者とより効果的に協力し、より高品質のコードを作成することができます。