跳转到主要内容

从Python和CLI启动Java代码,无需安装。

项目描述

build status Code style: black

jgo: 无痛的Java组件执行

摘要

Maven 是一款强大的工具。它管理依赖项,使得Java项目可以成为稳健的“构建块”,就像Python的 pip、JavaScript的 npm、Ruby的 gem、Perl的 cpan 等一样。而 Maven Central 仓库 包含了大量的代码,非常适合在自己的项目中重用。

不幸的是,Maven 并没有提供一种简单的方法来实际 启动 存储在 ~/.m2/repository 中的精心管理的依赖项。

本项目填补了这一空白:jgo 可以启动Java代码。您无需下载或安装任何JAR文件;只需指定一个由 Maven 艺术品标识符 组成的“端点”,如果需要/希望的话,加上主类,jgo 就会使用Maven来获取并运行它。

为此,jgo 会根据需要构建本地环境,将其缓存到 ~/.jgo 的一个子目录中,这样端点的特定依赖项就可在同一位置获得。

安装

jgo 项目最初是一个shell脚本,但后来被翻译成Python,这样工具如 scyjava 就可以利用其环境构建能力。

因此,现在有两个实现可供选择!每个都有其优缺点。

先决条件

jgo 使用 mvnjava 来完成繁重的任务。shell脚本版本需要一些常用工具(例如,cat)。如果缺少任何东西,脚本会告诉您。

shell脚本

jgo.sh shell脚本需要一个POSIX兼容的系统。已知它在Linux、macOS、Cygwin、微软的 Windows Subsystem for Linux 以及 Git for Windows 项目的Git BASH上可以工作。

安装shell脚本

只需克隆此存储库,并将 jgo.sh 符号链接到您最喜欢的 bin 目录。

例如,假设 ~/bin 在您的PATH中

cd
git clone https://github.com/scijava/jgo
cd bin
ln -s ../jgo/jgo.sh jgo
jgo --help

Python模块

jgo 的Python版本提供了一个 jgo 控制台脚本,以及一个用于以编程方式创建端点的 jgo 模块。

使用pip安装
pip install jgo
使用conda安装
conda install -c conda-forge jgo
从源代码安装
git clone https://github.com/scijava/jgo
cd jgo

# install globally (not recommended unless using a virtual environment)
pip install .

# install into ~/.local (see pip install --help for details)
pip install --user .

# install into $PREFIX
pip install --prefix=$PREFIX .

# install globally in developer mode (hot linked to working copy folder)
pip install -e .

使用方法

Usage: jgo [-v] [-u] [-U] [-m] <jvm-args> <endpoint> <main-args>

  -v          : verbose mode flag
  -u          : update/regenerate cached environment
  -U          : force update from remote Maven repositories (implies -u)
  -m          : use endpoints for dependency management (see "Pitfalls" below)
  <jvm-args>  : any list of arguments to the JVM
  <endpoint>  : the artifact(s) + main class to execute
  <main-args> : any list of arguments to the main class

The endpoint should have one of the following formats:

- groupId:artifactId
- groupId:artifactId:version
- groupId:artifactId:mainClass
- groupId:artifactId:version:mainClass
- groupId:artifactId:version:classifier:mainClass

If version is omitted, then RELEASE is used.
If mainClass is omitted, it is auto-detected.
You can also write part of a class beginning with an @ sign,
and it will be auto-completed.

Multiple artifacts can be concatenated with pluses,
and all of them will be included on the classpath.
However, you should not specify multiple main classes.

示例

程序 命令
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:@shell.Main+commons-cli:commons-cli:1.3.1

注意,当需要将元素添加到类路径时,可以使用 + 语法。

如果您将 scijava.public = https://maven.scijava.org/content/groups/public 添加到 .jgorc 文件的 [repositories] 部分(见下面的 仓库),您还可以尝试以下操作:

程序 命令
SciJava REPL with JRuby jgo org.scijava:scijava-common:@ScriptREPL+org.scijava:scripting-jruby
SciJava REPL with Jython jgo org.scijava:scijava-common:@ScriptREPL+org.scijava:scripting-jython
SciJava REPL with Groovy 使用jgo org.scijava:scijava-common:@ScriptREPL+org.scijava:scripting-groovy
SciJava REPL与Clojure 使用jgo org.scijava:scijava-common:@ScriptREPL+org.scijava:scripting-clojure
SciJava REPL与JavaScript 使用jgo org.scijava:scijava-common:@ScriptREPL+org.scijava:scripting-javascript

常见问题解答(FAQ)

  • 是否快速?端点在本地缓存~/.jgo下合成。因此,第二次调用相同的端点非常快。
  • “无安装”是什么意思?类路径元素是从~/.m2/repository而不是复制到~/.jgo中硬链接的,因此即使执行许多不同的端点,~/.jgo文件夹的占位也很小。
  • 如果端点有新版本怎么办?传递-U标志到jgo以重建端点。注意,与mvn不同,jgo不会在其他情况下检查更新。

配置

您可以使用~/.jgorc文件配置jgo的行为。

仓库

您可以定义额外的远程Maven仓库,从其中检索工件。例如。

[repositories]
scijava.public = https://maven.scijava.org/content/groups/public

如果您需要更多控制工件来源的位置——例如,如果您想使用自己的远程Maven仓库作为Maven Central的镜像——您可以使用Maven的常规~/.m2/settings.xml;请参阅使用镜像进行仓库

您还可以使用-r标志将额外的仓库传递给jgo的个别调用。

快捷方式

您可以定义用于启动常用程序的快捷方式

[shortcuts]
repl = imagej:org.scijava.script.ScriptREPL
imagej = net.imagej:imagej
fiji = sc.fiji:fiji:LATEST
scifio = io.scif:scifio-cli

快捷方式将直接从端点开始,按定义的顺序单遍替换。例如,现在您可以运行

jgo repl

注意,使用上面的repl快捷方式时,主类(org.scijava.script.ScriptREPL)来自一个不同的工件,而不是顶级工件(net.imagej:imagej)。这是故意的,以便将包括所有ImageJ,包括所有各种SciJava scripting-<foo>插件在内的所有内容都包含在REPL的类路径中。

设置

有一些可配置的设置

[settings]
m2Repo = /path/to/.m2Repo (default ~/.m2/repository)
cacheDir = /path/to/.jgo (default ~/.jgo)
links = soft (options: hard, soft, none; default hard)

注意,当使用Python jgo时,可以通过设置JGO_CACHE_DIR环境变量来设置jgo的缓存目录。从最高到最低读取缓存目录的优先级

  • JGO_CACHE_DIR环境变量
  • ~/.jgorc中的settings部分的cacheDir
  • 默认为~/.jgo

陷阱

依赖关系管理

Maven有一个功能,即项目可以通过<dependencyManagement>配置覆盖传递(也称为继承)依赖项的版本。问题是:库可能会相信它依赖于特定的版本组件,这些版本由其<dependencyManagement>定义,但依赖于该库的下游项目将解析到不同的版本。请参阅此SO线程此存档以获取完整详细信息。

为了解决这个问题,您可以将-m传递给jgo,这将导致它使用导入范围将所有端点添加到合成的POM的<dependencyManagement>部分。通过这样做,合成的项目中使用的传递依赖项的版本应该更精确地匹配每个端点本身的版本——尽管在通过+运算符连接具有冲突依赖关系管理的多个端点的情况下,较早的端点将获胜,因为它们将在POM中较早声明。有关详细信息,请参阅jgo问题跟踪器中的问题#9

开发

代码风格

jgo使用black进行代码风格。

pip install tox之后,您可以使用以下命令对代码进行lint

tox -e lint

替代品

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

jgo-1.0.6.tar.gz (23.3 kB 查看哈希值)

上传时间 源代码

构建分发

jgo-1.0.6-py3-none-any.whl (15.4 kB 查看哈希值)

上传时间 Python 3

支持者