はじめに
効果的なプロジェクト構造は、Java 開発の成功に欠かせない要素です。この包括的なガイドでは、Java プロジェクトを整理する基本原則を探求し、開発者に拡張性があり、保守しやすく、構造が良好なソフトウェアソリューションを作成するための実践的な知見を提供します。
効果的なプロジェクト構造は、Java 開発の成功に欠かせない要素です。この包括的なガイドでは、Java プロジェクトを整理する基本原則を探求し、開発者に拡張性があり、保守しやすく、構造が良好なソフトウェアソリューションを作成するための実践的な知見を提供します。
Java プロジェクトは、開発者がコードを効果的に管理するのに役立つ特定の組織化規則に従います。このステップでは、基本的なコンポーネントを理解するために、手動でシンプルな Java プロジェクト構造を作成します。
Java プロジェクトは通常、以下の要素を含みます。
.java).class)まず、ワークスペースに基本的なプロジェクト構造を作成しましょう。概念を説明するために、シンプルな "HelloWorld" アプリケーションを構築します。
まず、LabEx 環境でターミナルを開きます。ターミナルはすでに /home/labex/project ディレクトリにあるはずです。
Java アプリケーション用のプロジェクトディレクトリを作成します。
mkdir -p hello-java-app/src
cd hello-java-app
src ディレクトリ内に、シンプルな Java クラスファイルを作成するためのディレクトリを作成します。mkdir -p src/com/example/app
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!");
}
}
cd /home/labex/project/hello-java-app
mkdir -p bin
javac -d bin src/com/example/app/HelloWorld.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
この構造は以下の原則に従っています。
src ディレクトリにあります。com.example.app パッケージは com/example/app/ ディレクトリに対応しています。bin ディレクトリにあります。-cp フラグは、Java にコンパイルされたクラスをどこで見つけるかを指示します。これで、基本的な Java プロジェクト構造を手動で作成しました。この基礎は、実際のアプリケーションで使用されるより複雑なプロジェクト構造を理解するのに役立ちます。
このステップでは、パッケージを使用して Java コードを整理し、複数のクラスを持つより構造化されたアプリケーションを作成する方法を学びます。適切なパッケージの整理は、保守可能な Java プロジェクトに不可欠です。
Java のパッケージは階層的な命名規則に従います。
com.example)com.example.project)com.example.project.model)この構造を私たちのプロジェクトに実装しましょう。
異なる関心事に対して別々のパッケージを持つシンプルな図書館管理システムを構築します。
cd /home/labex/project
mkdir -p library-app/src
cd library-app
mkdir -p src/com/example/library/model
mkdir -p src/com/example/library/service
mkdir -p src/com/example/library/util
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 + "}";
}
}
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;
}
}
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());
}
}
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);
}
}
}
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
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 ## メインアプリケーション
この構造は重要な設計原則に従っています。
関心事の分離:
model パッケージ:データ構造を含みます。service パッケージ:ビジネスロジックを含みます。util パッケージ:ユーティリティ関数を含みます。論理的なグルーピング:関連するクラスは同じパッケージにグループ化されています。
直感的なナビゲーション:パッケージ構造により、特定の機能を簡単に見つけることができます。
インポート管理:クラスはインポートを通じて相互に参照し、依存関係が明確になります。
このようにコードを整理することで、理解しやすく拡張しやすい、より保守可能で拡張性のあるアプリケーションを作成できます。
このステップでは、Apache Maven を使用して Java プロジェクトを管理する方法を学びます。Maven は強力なビルド自動化および依存関係管理ツールで、プロジェクトのセットアップとメンテナンスを簡素化します。
Maven は以下を提供します。
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"
cd /home/labex/project
mvn archetype:generate \
-DgroupId=com.example.calculator \
-DartifactId=simple-calculator \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=1.4 \
-DinteractiveMode=false
このコマンドは、標準的なディレクトリ構造を持つ新しいプロジェクトを作成します。
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)で、これがプロジェクトの設定を定義します。
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:テスト用リソース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!" );
}
}
もっとクラスを追加して、計算機プロジェクトを拡張しましょう。
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;
}
}
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!");
}
}
mvn compile
以下のような出力で終わるはずです。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
mvn package
このコマンドはコードをコンパイルし、テストを実行し、アプリケーションをパッケージ化します。
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!
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 コマンドです。
mvn compile:ソースコードをコンパイルします。mvn test:テストを実行します。mvn package:配布可能なパッケージ(JAR、WAR)を作成します。mvn install:パッケージをローカルリポジトリにインストールします。mvn clean:ビルドアーティファクト(target ディレクトリ)を削除します。mvn clean install:clean と install の組み合わせMaven は、規約、依存関係管理、ビルド自動化を提供することで、Java プロジェクト管理を大幅に簡素化しました。この標準化されたアプローチにより、開発者はプロジェクト構造の管理ではなく、コードの記述に集中することができます。
この実験では、実践を通じて Java プロジェクト構造を管理するための重要な戦略を学びました。
まず、基本的な Java プロジェクト構造を手動で作成し、ソースディレクトリ、パッケージ、およびコンパイル済みコードの組織の基本的な要素を理解しました。
次に、適切なパッケージ構成を持つより複雑なプロジェクトを作成し、機能をモデル、サービス、およびユーティリティパッケージに分割することで関心事の分離を実現しました。
最後に、強力なビルド自動化ツールである Maven を使用して、依存関係管理と自動化されたビルドプロセスを備えた標準化された Java プロジェクトを作成および管理する方法を学びました。
これらの基礎的なスキルは、将来の Java 開発作業の堅固な基盤となり、整理された、保守可能で拡張性のあるアプリケーションを作成することができます。プロジェクト構造に関する既存の規約とベストプラクティスに従うことで、他の開発者とより効果的に協力し、より高品質のコードを作成することができます。