# jgo
**Repository Path**: mirrors_scijava/jgo
## Basic Information
- **Project Name**: jgo
- **Description**: Launch Java code from the CLI, installation-free. ☕
- **Primary Language**: Unknown
- **License**: Unlicense
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-25
- **Last Updated**: 2026-03-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://github.com/apposed/jgo/actions/workflows/build.yml)
[](https://jgo.apposed.org/)
# 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.
```bash
# 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 `cjdk` integration
- **Pure Python dependency resolver**: No Maven installation required to resolve dependency graphs
- **Reproducible environments**: `jgo.toml` project files with lock files (like `package.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
```bash
# 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
```python
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:
```toml
# 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
```
```bash
# Run from current directory
jgo sync
# Creates .jgo/ with jars/ and jgo.lock.toml
```
## Installation
Installing jgo with uv
```shell
uv tool install jgo
```
Installing jgo with pip
```shell
pip install jgo
```
Installing jgo with conda
```shell
conda install -c conda-forge jgo
```
Installing jgo from source
```shell
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.
Using jgo as a dependency
```shell
uv add jgo
```
or
```shell
pixi add jgo
```
Not sure which to use? [Read this](https://jacobtomlinson.dev/posts/2025/python-package-managers-uv-vs-pixi/#so-what-do-i-use).
## 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](https://jgo.apposed.org/en/latest/configuration.html)),
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](https://en.wikipedia.org/wiki/Hard_link)
into `~/.cache/jgo` from `~/.m2/repository` rather 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 `-u` flag to `jgo` to rebuild the endpoint.
Note that unlike `mvn`, `jgo` does not check for updates otherwise.
## Documentation
Full documentation is available at **[jgo.apposed.org](https://jgo.apposed.org/)**:
- **[Getting Started](https://jgo.apposed.org/en/latest/getting-started.html)** — Installation and quick start
- **[CLI Reference](https://jgo.apposed.org/en/latest/cli.html)** — All commands and options
- **[Project Mode](https://jgo.apposed.org/en/latest/project-mode.html)** — Working with `jgo.toml`
- **[Python API](https://jgo.apposed.org/en/latest/python-api.html)** — Using jgo from Python code
- **[Configuration](https://jgo.apposed.org/en/latest/configuration.html)** — Repositories, shortcuts, and settings
- **[Migration Guide](https://jgo.apposed.org/en/latest/migration.html)** — Upgrading from jgo 1.x
- **[Architecture](https://jgo.apposed.org/en/latest/architecture.html)** — The three-layer design
Use `help(jgo)` in Python for detailed API documentation.
## Development
### Code style
`jgo` uses [`ruff`](https://github.com/astral-sh/ruff) for linting and formatting:
```shell
make lint
```
### Testing
```shell
# 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
* [JBang](https://github.com/jbangdev/jbang)
* [mvnx](https://github.com/mvnx/mvnx) (unmaintained)
* [JPM4J](https://github.com/jpm4j) (discontinued)
* [Mop](https://github.com/chirino/mop) (unmaintained)
* [marun](https://github.com/nishemon/marun) (unmaintained, Python 2 only)