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
PATH
上的目录中。另一方面,我喜欢自动工具的工作方式:用户不需要手动复制任何东西,因为构建步骤make install
会为她处理安装。
我可以通过我cp
中的ant任务使用pom.xml
来模拟这种行为,但我对学习Java良好实践比对提供非标准行为更感兴趣。
似乎maven doesn't provide this behavior。另一方面,我完全不知道其他Java构建工具可以做什么。
编辑:
据我所知mvn install
和mvn deploy
不符合我的需要,因为他们会在我的本地或远程存储库中安装我的jar。而我想在我的PATH
上安装我的可执行文件(例如:在/usr/local/bin
中安装我的包装脚本)
答案 0 :(得分:2)
问题标记为“gradle”,因此我将提供Gradle答案。
我认为你正在构建一个应用程序,而不是一个库。在这种情况下,Gradle正在考虑提供application
插件。
apply plugin: 'application'
该插件将为您提供run
,distZip
,distTar
和installDist
任务,这些任务听起来就像它们一样。查看文档
the official web site
请注意,默认情况下,installDist任务不会将软件集中放在系统的任何位置。相反,它将安装在build
的子目录中,其中保存临时文件。您可以在任务上设置destinationDir
属性以解决此问题。
答案 1 :(得分:1)
您可以创建一个可由用户下载的分发存档(zip,tar.gz),只需解压缩并将bin文件夹添加到路径中。
问题在于您无法自动增强路径环境变量。但是如果你使用appassembler-maven-plugin生成的脚本,你可以直接调用生成的脚本而不增强你的路径。这适用于Linux和Windows。
这可以通过appassembler-maven-plugin和maven-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;做你需要的。