Python × Java比較:仮想環境と開発環境
Pythonの仮想環境を、JavaにおけるJDK・Maven/Gradle・依存JAR・Wrapper・コンテナと比較する資料です。
Python 3.11以降、Java 17以降を想定しています。
目次
- 最初に押さえる結論
- Python仮想環境の役割
- Javaに直接対応する仕組みがない理由
- 対応関係の比較
- Python環境の作成・利用
- Javaプロジェクト環境の作成・利用
- Python実行環境とJava実行環境の確認
- 依存関係の保存場所
- バージョン固定と再現性
- Dockerとの違い
- 実行できる比較コード
- よくある混同
- まとめ
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.txt、pyproject.toml
|
pom.xml、build.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 |
java・javac
|
Javaは実行とコンパイルのコマンドが分かれる |
pip |
Maven/Gradleの依存解決 | Maven/Gradleはビルド全体も担当 |
site-packages |
class path上の依存JAR | Java側は共有キャッシュを利用しやすい |
requirements.txt |
pom.xml/build.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