Launch Java code from Python and the CLI, installation-free.
Project description
jgo: painless Java environments and execution
Summary
jgo launches Java applications directly from Maven coordinates—no installation required. Specify a Maven artifact identifier and an optional main class, and jgo resolves dependencies, materializes the environment including the version of Java needed, and runs your program.
# Run Jython REPL (latest version)
jgo org.python:jython-standalone
# Run with specific version
jgo org.python:jython-standalone:2.7.3
Features
- Zero-configuration execution: Automatic Java download and version management thanks to
cjdkintegration - Pure Python dependency resolver: No Maven installation required to resolve dependency graphs
- Reproducible environments:
jgo.tomlproject files with lock files (likepackage.json+package-lock.json) - Three-layer architecture: Independently useful layers for Maven resolution, environment building, and execution
- Powerful Python API: Fine-grained control over dependency resolution and execution
- Intelligent module handling: Full support of the Java module system (JPMS), including intelligent classification of dependencies on module-path or class-path as appropriate
Quick Start
CLI Usage
# Run Jython REPL
jgo org.python:jython-standalone
# Run with arguments
jgo org.python:jython-standalone -- -- script.py --verbose
# Multiple artifacts with main class (use @ separator)
jgo org.scijava:scijava-common+org.scijava:scripting-jython@ScriptREPL
# Force update from remote repos
jgo -u org.python:jython-standalone
# Use specific Java version
jgo --java-version 17 net.imagej:imagej
# Print classpath without running
jgo info classpath org.python:jython-standalone
# Preview commands without executing (--dry-run)
jgo --dry-run run org.scijava:parsington # See java command
jgo --dry-run init org.python:jython-standalone # Preview jgo.toml
Python API
import jgo
# Simple one-liner
jgo.run("org.python:jython-standalone:2.7.3", app_args=["script.py"])
# Build environment without running
env = jgo.build("org.python:jython-standalone")
print(env.classpath) # List of JAR paths
# Resolve dependencies
components = jgo.resolve("org.python:jython-standalone")
for comp in components:
print(f"{comp.groupId}:{comp.artifactId}:{comp.version}")
Project Mode with jgo.toml
Create reproducible environments:
# jgo.toml
[environment]
name = "my-java-app"
[repositories]
scijava.public = "https://maven.scijava.org/content/groups/public"
[dependencies]
coordinates = ["net.imagej:imagej:2.15.0"]
[entrypoints]
default = "main"
main = "net.imagej.Main"
[settings]
cache_dir = ".jgo" # Local environment like .venv
# Run from current directory
jgo sync
# Creates .jgo/ with jars/ and jgo.lock.toml
Installation
Installing jgo with uv
uv tool install jgo
Installing jgo with pip
pip install jgo
Installing jgo with conda
conda install -c conda-forge jgo
Installing jgo from source
git clone https://github.com/apposed/jgo
uv tool install --with-editable jgo jgo
When installed in this fashion, changes to the jgo source code will be immediately reflected when running jgo from the command line.
Examples
| Program | Command |
|---|---|
| Jython REPL | jgo org.python:jython-standalone |
| JRuby eval | echo "puts 'Hello Ruby'" | jgo org.jruby:jruby-complete@jruby.Main |
| Groovy REPL | jgo org.codehaus.groovy:groovy-groovysh+commons-cli:commons-cli:1.3.1@shell.Main |
Note the usage of the + syntax as needed to append elements to the classpath.
If you add
scijava.public = https://maven.scijava.org/content/groups/public
to the
[repositories] section of your settings file
(see the configuration docs),
you can also try:
| Program | Command |
|---|---|
| SciJava REPL with JRuby | jgo org.scijava:scijava-common+org.scijava:scripting-jruby@ScriptREPL |
| SciJava REPL with Jython | jgo org.scijava:scijava-common+org.scijava:scripting-jython@ScriptREPL |
| SciJava REPL with Groovy | jgo org.scijava:scijava-common+org.scijava:scripting-groovy@ScriptREPL |
| SciJava REPL with Clojure | jgo org.scijava:scijava-common+org.scijava:scripting-clojure@ScriptREPL |
| SciJava REPL with JavaScript | jgo org.scijava:scijava-common+org.scijava:scripting-javascript@ScriptREPL |
FAQ
- Is it fast?
Endpoints are synthesized in a local cache under
~/.cache/jgo. So invoking the same endpoint a second time is really quick. - What does "no installation" mean?
Classpath elements are hard-linked
into
~/.cache/jgofrom~/.m2/repositoryrather than copied, so the cache folder has a tiny footprint even if you execute lots of different endpoints. - What if an endpoint has a new version?
Pass the
-uflag tojgoto rebuild the endpoint. Note that unlikemvn,jgodoes not check for updates otherwise.
Documentation
Full documentation is available at jgo.apposed.org:
- Getting Started — Installation and quick start
- CLI Reference — All commands and options
- Project Mode — Working with
jgo.toml - Python API — Using jgo from Python code
- Configuration — Repositories, shortcuts, and settings
- Migration Guide — Upgrading from jgo 1.x
- Architecture — The three-layer design
Use help(jgo) in Python for detailed API documentation.
Development
Code style
jgo uses ruff for linting and formatting:
make lint
Testing
# Run all tests
make test
# Run specific test file
bin/test.sh tests/test_maven_basic.py
# Run with coverage
uv run pytest --cov=src/jgo tests/
Alternatives
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jgo-2.1.3.tar.gz.
File metadata
- Download URL: jgo-2.1.3.tar.gz
- Upload date:
- Size: 247.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
464152088b34ed995dc3518418e5132df26af97deb16f99858ee4bbbfe4a794a
|
|
| MD5 |
151505bac683f9ac74b0a210d79f94e5
|
|
| BLAKE2b-256 |
f427bbcb587e297ffc15b713e3dadf2bd0219384bd860dffc0eff65e6bfd8146
|
File details
Details for the file jgo-2.1.3-py3-none-any.whl.
File metadata
- Download URL: jgo-2.1.3-py3-none-any.whl
- Upload date:
- Size: 186.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d44526646dde15f566982c87a032b1b363ad388827d00d3afdbc109ad1431c11
|
|
| MD5 |
832363d16512dad21625ad54264ec9f4
|
|
| BLAKE2b-256 |
20294558a4ee221e4f09ea0b1d30bc2d5bf3e9c018bbb7e255a0442b090de893
|