从Python和CLI启动Java代码,无需安装。
项目描述
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
使用 mvn
和 java
来完成繁重的任务。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
替代品
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。