相当于Java世界中的“make install”

时间:2015-05-05 09:55:48

标签: java maven ant gradle autotools

TL; DR :Java世界中是否有标准的方法,让构建工具安装他们刚刚构建的可执行文件(如C世界的make install)?< / p>

(我很满意只适用于Linux的解决方案)

更多详情

我有一个通过github分发的Java项目。使用maven 2管理编译和依赖项。运行mvn package使用我的jar和运行时所需的依赖项构建tarball,以及设置类路径并启动主jar的可执行脚本:

#!/bin/bash
cpBase="$(dirname "$0")"
java -cp "$cpBase/*" dw.cli.Program $@

因此,如果有人想在她的计算机上安装它,则需要:

  • 运行mvn package
  • 然后解压缩tarball并将内容复制到PATH上的目录中。

另一方面,我喜欢自动工具的工作方式:用户不需要手动复制任何东西,因为构建步骤make install会为她处理安装。

我可以通过我cp中的ant任务使用pom.xml来模拟这种行为,但我对学习Java良好实践比对提供非标准行为更感兴趣。

似乎maven doesn't provide this behavior。另一方面,我完全不知道其他Java构建工具可以做什么。

编辑:

据我所知mvn installmvn deploy不符合我的需要,因为他们会在我的本地或远程存储库中安装我的jar。而我想在我的PATH上安装我的可执行文件(例如:在/usr/local/bin中安装我的包装脚本)

4 个答案:

答案 0 :(得分:2)

问题标记为“gradle”,因此我将提供Gradle答案。

我认为你正在构建一个应用程序,而不是一个库。在这种情况下,Gradle正在考虑提供application插件。

apply plugin: 'application'

该插件将为您提供rundistZipdistTarinstallDist任务,这些任务听起来就像它们一样。查看文档 the official web site

请注意,默认情况下,installDist任务不会将软件集中放在系统的任何位置。相反,它将安装在build的子目录中,其中保存临时文件。您可以在任务上设置destinationDir属性以解决此问题。

答案 1 :(得分:1)

您可以创建一个可由用户下载的分发存档(zip,tar.gz),只需解压缩并将bin文件夹添加到路径中。

问题在于您无法自动增强路径环境变量。但是如果你使用appassembler-maven-plugin生成的脚本,你可以直接调用生成的脚本而不增强你的路径。这适用于Linux和Windows。

这可以通过appassembler-maven-pluginmaven-assembly-plugin的组合来实现。

appassembler-maven-plugin会为你创建合适的shell / bat / cmd文件,maven-assembly-plugin可以为你创建合适的档案(tar.gz,zip)。

举个例子,你可以看一下:

https://github.com/khmarbaise/supose/tree/master/supose-assembly

答案 2 :(得分:1)

“make install”的工作原理是将您构建的人工制品复制到目标位置。这种行为很容易在ANT中模拟,因为像make一样,它允许你指定自己的构建逻辑:

<target name="install" description="Copy binaries into install location">
  <mkdir dir="/opt/myapp/bin"/>
  <copy file="${dist.dir}/myproject.jar" todir="/opt/myapp/bin"/>
  <copy file="${dist.dir}/myproject.sh" todir="/opt/myapp/bin"/>
  <chown owner="${install.owner}">
    <fileset dir="/opt/myapp" include="**/*"/>
  </chown>
</target>

当然,您必须以root身份运行此目标:

ant build
sudo ant install
另一方面,Maven是一种高度自以为是的构建工具,不支持这种工作流程。为什么?这实际上是一个部署操作。当然你可以使用ant ANT插件自定义Maven设置,但我建议你稍后再运行一个shell脚本。很容易理解:

mvn install
sudo install_myapp.sh

该脚本可以从Maven本地存储库“$ HOME / .m2 / repository”中获取构建的jar,或者更好的是从Maven存储库下载它!

答案 3 :(得分:-1)

您还有其他mvn目标,例如&mvn deploy&#39;并且安装&#39;做你需要的。