0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python × Java比較:仮想環境と開発環境 早見表

0
Posted at

Python × Java比較:仮想環境と開発環境

Pythonの仮想環境を、JavaにおけるJDK・Maven/Gradle・依存JAR・Wrapper・コンテナと比較する資料です。
Python 3.11以降、Java 17以降を想定しています。


目次

  1. 最初に押さえる結論
  2. Python仮想環境の役割
  3. Javaに直接対応する仕組みがない理由
  4. 対応関係の比較
  5. Python環境の作成・利用
  6. Javaプロジェクト環境の作成・利用
  7. Python実行環境とJava実行環境の確認
  8. 依存関係の保存場所
  9. バージョン固定と再現性
  10. Dockerとの違い
  11. 実行できる比較コード
  12. よくある混同
  13. まとめ

1. 最初に押さえる結論

Javaには、Pythonのvenvと完全に同じ仕組みはありません。

Pythonのvenvは、プロジェクトごとにPython実行環境とsite-packagesを分けます。

Javaでは、通常、次を別々に管理して開発環境を再現します。

Java環境の再現
├─ JDKのバージョン
├─ Maven/Gradleのバージョン
├─ pom.xml/build.gradleの依存関係
├─ Maven/Gradle Wrapper
├─ 環境変数・設定
└─ 必要に応じてDocker

おおまかな比較

目的 Python Java
言語実行環境 仮想環境内のPython 選択したJDK
外部ライブラリ 仮想環境のsite-packages Maven/Gradleが解決したJAR
依存関係定義 requirements.txtpyproject.toml pom.xmlbuild.gradle
ツールバージョン固定 uv・Poetryなども利用 Maven Wrapper・Gradle Wrapper
JDKバージョン指定 仮想環境作成元のPython Toolchains、JAVA_HOME、IDE設定
OSレベルの分離 しない しない
OSを含む再現 Dockerなど Dockerなど

2. Python仮想環境の役割

python -m venv .venv

仮想環境を作ると、主に次が用意されます。

  • 仮想環境用のPython実行ファイル
  • 仮想環境用のpip
  • 仮想環境用のsite-packages
  • 有効化スクリプト
  • 元のPythonを示す設定
sample-python/
├─ .venv/
│  ├─ Scripts/ または bin/
│  ├─ Lib/ または lib/
│  └─ pyvenv.cfg
├─ app.py
└─ requirements.txt

仮想環境Aに入れたパッケージは、通常、仮想環境Bには見えません。


3. Javaに直接対応する仕組みがない理由

Javaプロジェクトでは、外部ライブラリをプロジェクト内へ個別にコピーするより、MavenやGradleが依存関係を解決し、共有キャッシュに保存したJARをclass pathへ組み込む方式が一般的です。

Mavenローカルリポジトリ
~/.m2/repository
    ↑
複数プロジェクトが同じJARを利用できる
Gradleキャッシュ
~/.gradle/caches
    ↑
複数プロジェクトが同じ依存ファイルを利用できる

つまり、Javaでは次の2点を分けます。

JDK
    → Javaそのもののコンパイル・実行環境

Maven/Gradle
    → プロジェクトごとの依存関係とビルド

Python仮想環境の「専用Python+専用パッケージ導入先」という一体型の考え方に対し、Javaでは「JDK選択」と「プロジェクト依存関係」を別々に管理します。


4. 対応関係の比較

略語

略語 読み方 意味
JDK ジェー・ディー・ケー Java Development Kit:Java開発ツール一式
JVM ジェー・ブイ・エム Java Virtual Machine:Javaバイトコードを実行する仮想マシン
JRE ジェー・アール・イー Java Runtime Environment:Java実行環境という概念
POM ポム Project Object Model:Maven設定
CI シー・アイ Continuous Integration:継続的インテグレーション
SDK エス・ディー・ケー Software Development Kit:開発キット

対応表

Python Javaで近い役割 違い
.venv JDK選択+ビルドツールのプロジェクト設定 Javaでは1つのディレクトリに統合されないことが多い
python javajavac Javaは実行とコンパイルのコマンドが分かれる
pip Maven/Gradleの依存解決 Maven/Gradleはビルド全体も担当
site-packages class path上の依存JAR Java側は共有キャッシュを利用しやすい
requirements.txt pom.xmlbuild.gradle Java側は依存関係グラフとビルド設定を宣言
python -m pip freeze mvn dependency:tree/Gradleの依存レポート 出力目的・固定方法は異なる
仮想環境の有効化 通常、直接対応なし JAVA_HOMEやWrapperを使う
.venv削除・再作成 ビルドディレクトリ削除+依存再取得 JDKは別管理

5. Python環境の作成・利用

作成

python -m venv .venv

有効化

Windows PowerShell:

.\.venv\Scripts\Activate.ps1

Windows Command Prompt:

.venv\Scripts\activate.bat

Git Bash:

source .venv/Scripts/activate

macOS・Linux:

source .venv/bin/activate

依存関係を導入

python -m pip install -r requirements.txt

実行

python app.py
python -m unittest

無効化

deactivate

6. Javaプロジェクト環境の作成・利用

6-1. JDKを確認する

java --version
javac --version

出力例:

openjdk 21.x
javac 21.x

6-2. Mavenプロジェクト

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
                             https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>sample-app</artifactId>
    <version>1.0.0</version>

    <properties>
        <!-- 使用するJava言語レベルを指定する。 -->
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

実行:

./mvnw test
./mvnw package

Windows:

mvnw.cmd test
mvnw.cmd package

6-3. Gradleプロジェクト

build.gradle

plugins {
    id 'java'
}

java {
    toolchain {
        // ビルドで必要なJava言語バージョンを宣言する。
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

実行:

./gradlew test
./gradlew build

Windows:

gradlew.bat test
gradlew.bat build

Wrapperとは

**Wrapper(ラッパー)**は、プロジェクトで使用するMaven/Gradleのバージョンを揃えるためのスクリプトと設定です。

Maven Wrapper
├─ mvnw
├─ mvnw.cmd
└─ .mvn/wrapper/

Gradle Wrapper
├─ gradlew
├─ gradlew.bat
└─ gradle/wrapper/

Wrapperのメリット:

  • 開発者間でビルドツールのバージョンを揃えられる
  • CIでも同じコマンドを使える
  • システムへMaven/Gradleを直接インストールしなくても実行できる場合がある

Wrapperが固定するのは主にMaven/Gradleのバージョンです。JDKのバージョン固定とは別です。


7. Python実行環境とJava実行環境の確認

Python

python -c "import sys; print(sys.executable)"
python -c "import sys; print(sys.prefix != sys.base_prefix)"
python -m pip --version
python -m pip list

Java

java --version
javac --version

Java実行中に確認するコード:

public class EnvironmentInfo {
    public static void main(String[] args) {
        System.out.println("Java: " + System.getProperty("java.version"));
        System.out.println("Vendor: " + System.getProperty("java.vendor"));
        System.out.println("Java home: " + System.getProperty("java.home"));
        System.out.println("OS: " + System.getProperty("os.name"));
    }
}

コンパイル・実行:

javac EnvironmentInfo.java
java EnvironmentInfo

出力例:

Java: 21.0.x
Vendor: Eclipse Adoptium
Java home: ...
OS: Windows 11

出力内容は、使用しているJDKとOSによって変わります。

IDEでも確認する

Python Java
Python Interpreterを.venvへ設定 Project SDK/Gradle JVM/Maven JDKを設定
ターミナルとIDEのPythonが同じか確認 ターミナル、IDE、ビルドツールのJDKが同じか確認

8. 依存関係の保存場所

Python

仮想環境ごとのsite-packages

Windows
.venv\Lib\site-packages

macOS・Linux
.venv/lib/python3.x/site-packages

確認:

python -m pip show requests
python -c "import requests; print(requests.__file__)"

Maven

通常のローカルリポジトリ:

Windows
%USERPROFILE%\.m2\repository

macOS・Linux
~/.m2/repository

確認:

./mvnw dependency:tree

Gradle

通常のキャッシュ:

Windows
%USERPROFILE%\.gradle\caches

macOS・Linux
~/.gradle/caches

確認:

./gradlew dependencies

重要な違い

Python venv
    プロジェクト環境ごとにパッケージを配置

Maven/Gradle
    依存ファイルをユーザー共通キャッシュへ保存し、
    プロジェクトごとの依存関係定義に基づいて利用

9. バージョン固定と再現性

Pythonで再現するもの

Pythonのバージョン
依存パッケージとバージョン
OS依存パッケージ
環境変数
外部サービス

代表ファイル:

.python-version
requirements.txt
pyproject.toml
uv.lock/poetry.lockなど

Javaで再現するもの

JDKのベンダー・バージョン
Maven/Gradleのバージョン
依存関係
ビルドプラグイン
環境変数
外部サービス

代表ファイル:

pom.xml
build.gradle/build.gradle.kts
mvnw・mvnw.cmd・.mvn/wrapper/
gradlew・gradlew.bat・gradle/wrapper/

Maven Toolchainsの考え方

Maven Toolchainsを使うと、ビルドで利用するJDKを選択できます。概念例:

<toolchain>
    <type>jdk</type>
    <provides>
        <version>21</version>
    </provides>
    <configuration>
        <jdkHome>/path/to/jdk-21</jdkHome>
    </configuration>
</toolchain>

実際の設定方法は、プロジェクトのMavenプラグイン構成と開発環境に合わせます。

Gradle Toolchains

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

Gradleは条件に合うJDKを探し、設定によってはダウンロードも行えます。

再現性の段階

依存関係ファイルだけ
    ↓
言語・ビルドツールのバージョンも固定
    ↓
OSパッケージや外部ツールも固定
    ↓
Dockerイメージで実行環境全体を固定

10. Dockerとの違い

比較 Python仮想環境 JavaのMaven/Gradle設定 Docker
言語パッケージ 分離する 依存グラフを分離する イメージ内へ含められる
OSファイル 分離しない 分離しない コンテナ内で分離する
ネイティブツール 原則、分離しない 原則、分離しない イメージへ固定できる
起動コスト 小さい 小さい 仮想マシンより軽いが追加コストあり
主目的 Python依存関係の分離 Javaビルド・依存関係の再現 アプリ実行環境全体の再現

組み合わせることもある

Python
Dockerコンテナ
└─ .venvまたはコンテナ内Python環境

Java
Dockerコンテナ
└─ JDK+Maven/GradleでビルドしたJAR

仮想環境とDockerは競合する考え方ではなく、分離する範囲が異なります。


11. 実行できる比較コード

Python

python_environment.py

from __future__ import annotations

import sys


def main() -> None:
    """現在のPython環境を短く表示する。"""
    print(f"Python: {sys.version_info.major}.{sys.version_info.minor}")
    print(f"仮想環境: {sys.prefix != sys.base_prefix}")
    print(f"実行環境名: {sys.implementation.name}")


if __name__ == "__main__":
    main()

仮想環境内の実行結果例:

Python: 3.13
仮想環境: True
実行環境名: cpython

Java

JavaEnvironment.java

public class JavaEnvironment {
    public static void main(String[] args) {
        // JVMが実行時に保持しているシステムプロパティを確認する。
        String fullVersion = System.getProperty("java.version");
        String majorVersion = fullVersion.split("\\.")[0];

        System.out.println("Javaメジャーバージョン: " + majorVersion);
        System.out.println("JVM名: " + System.getProperty("java.vm.name"));
        System.out.println("Java homeあり: "
                + !System.getProperty("java.home").isBlank());
    }
}
javac JavaEnvironment.java
java JavaEnvironment

Java 21での実行結果例:

Javaメジャーバージョン: 21
JVM名: OpenJDK 64-Bit Server VM
Java homeあり: true

JVM名は利用するJDKによって変わります。


12. よくある混同

「Mavenプロジェクトを作ればJDKも分離される」

誤りです。Mavenは、現在利用できるJDKまたはToolchainsで選択したJDKを使います。

確認:

java --version
./mvnw --version

「Gradle WrapperがJDKも固定する」

Wrapperは主にGradle本体のバージョンを固定します。JDKはToolchainsや実行環境側で管理します。

./gradlew --version

「Mavenの.m2がPythonの.venvと同じ」

異なります。

  • .venv:特定プロジェクト用のPython環境
  • .m2/repository:複数のMavenプロジェクトで共有される依存アーティファクトの保存場所

「Python仮想環境を作ればPython本体の任意バージョンへ変わる」

venvは、作成時に指定したPythonを基に環境を作ります。

python3.12 -m venv .venv

別のPythonバージョンを使うには、そのPythonを事前に用意する必要があります。

「Javaは静的型付けだから依存関係管理が不要」

型検査と外部ライブラリ取得は別です。必要なJARがclass pathにない場合、コンパイルや実行に失敗します。


13. まとめ

全体まとめ

Pythonのvenvは、プロジェクトごとにPythonと外部パッケージの導入先を分ける仕組みです。Javaには直接同じ仕組みはなく、JDKの選択、MavenまたはGradleによる依存関係、Wrapperによるビルドツールの固定を組み合わせて環境を再現します。Pythonの.venvはプロジェクト専用ですが、JavaのMavenやGradleは依存JARをユーザー共通キャッシュへ保存する点も異なります。OSを含めて揃える場合は、どちらもDockerなどを利用します。

対応イメージ

Python
.venv + requirements.txt/pyproject.toml

Java
JDK + pom.xml/build.gradle + Maven/Gradle Wrapper

さらにOSまで揃える
Docker

最低限の確認コマンド

# Python
python -c "import sys; print(sys.executable)"
python -m pip --version
python -m pip list

# Java
java --version
javac --version
./mvnw --version
./gradlew --version

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?