我已成功创建Java JAR文件.我现在想要将我的JAR文件打包为RPM(RedHat包管理器),以便我可以为Linux安装它.
将单个JAR文件打包为RPM的正确方法是什么?
我需要为包中的一个主要目录指定公共属性,并为其中一些子目录指定特殊权限.例如
%files
%attr(-, myuser, mygroup) /opt/myapp
%attr(750, myuser, mygroup) /opt/myapp/bin # no exec permission to other
/etc # this is the reason I can't use %defattr(-, myuser, mygroup)
Run Code Online (Sandbox Code Playgroud)
我自然地在/ opt/myapp/bin下的每个文件上收到"文件列出两次"警告.我的问题是,它究竟意味着什么?rpmbuild用它做什么?我无法在任何地方找到答案.我可以忽略它吗?什么优先,第一次或最后一次?
我不想myapp明确列出所有内容来解决这个问题.还有其他方法吗?谢谢
我需要构建一个RPM,其唯一目的是安装一些字体.我已经阅读了几个关于它的教程,但是每个人似乎都暗示了一些不同的东西,而且我无法找到像这样的非常基本的设置.
是否可以仅引用规范的%files部分中的文件?我尝试过,rpm总是试图找到tmp目录中的文件.我是否需要添加一个特定的构建步骤,将我需要的所有内容复制到tmp目录中?
在构建rpm时,这些文件是否应该进入SOURCE或BUILD目录?我一直在寻找很多不同的信息.有人建议构建一个包含文件的tarball并放在SOURCE目录下,但这看起来有点不对,因为字体文件对我来说不是实际的源文件.
理想情况下,我想将所有字体文件放在一个目录结构中的BUILD文件夹中,如'./usr/share/fonts/',然后在SPEC的%file部分引用它,让RPM发挥其魔力.可能我在这里遗漏或误解了一些东西.
%files部分是否总是希望在tmp目录中找到源文件,或者我的设置有问题?我创建了包含的〜/ .rpmmacros
%_topdir /Users/user/rpm
Run Code Online (Sandbox Code Playgroud)
这是根构建目录,包含BUILD,RPMS,SOURCES,SPECS和tmp目录.
如果有人能够提供spec文件中最不需要的项目以使其干净利落,我会很高兴.
编辑
按照user3159253的建议,我使用以下spec文件:
Name: test
Version: 1.0.0
Release: 1
Copyright: Copyright info
Group: Applications/System
BuildArch: noarch
%description
Brief description of software package.
%prep
%build
%install
mkdir -p %{buildroot}/usr/share/fonts
cp ./usr/share/fonts/* %buildroot/usr/share/fonts/
%clean
%files
/usr/share/fonts/*
Run Code Online (Sandbox Code Playgroud)
我将字体复制到BUILD/usr/share/fonts /目录中.如果我在rpm中查询文件列表,那么所有字体都在那里.但是,当我安装rpm时,它会抱怨
/usr/share/fonts is needed by test-1.0.0-1.noarch
Run Code Online (Sandbox Code Playgroud)
但是,如果此目录存在与否并不重要,所以我猜rpm正在抱怨此资源未在其数据库中列出.
我已经能够通过将%file部分更改为:
/usr/
/usr/share/
/usr/share/fonts/
/usr/share/fonts/*
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑这是一个好主意.有没有更好的方法来解决这个问题?
我有一个RPM规范文件,在rhel7上使用rpmbuild构建,我想用脚本定义Version.
我在这里阅读http://www.techrepublic.com/article/rpmproc-spec-file/,我可以这样做:
%define version 1.2
Version: %{version}
Run Code Online (Sandbox Code Playgroud)
在这里RPM spec文件 - 是否可以动态填充spec文件变量,我可以用脚本定义:
%define whoami %(cmd)
Run Code Online (Sandbox Code Playgroud)
所以我试着在我的规范文件中这样做:
%define version %(echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')")
Version: %{version} **Line 23**
Run Code Online (Sandbox Code Playgroud)
但我得到了一个
error: line 23: Empty tag: Version:
Run Code Online (Sandbox Code Playgroud)
到目前为止我测试的东西:
%define version %(echo "12") --basic script works ok, version becomes 12
//As a command straight in terminal
$ echo "$(sed -n 's|^[ ]*appVersion = "\(.*\)"|\1|p' /fullfilepath/values.txt | sed 's/^\(.*\)-.*$/\1/')"
//returns 1.2
Run Code Online (Sandbox Code Playgroud)
这些工作得很好,所以我不知道是什么导致它失败.当我在spec文件中的define标签中调用相同的东西时,有什么想法可能会让它失败?
更新
我尝试用实际值替换文件名,所以它看起来像这样
echo "$(sed …Run Code Online (Sandbox Code Playgroud) 我需要从在Windows计算机上运行的ANT脚本创建RPM包.此包必须包含构建中的结果类以及其他一些其他资源.
我想应该有一些程序可以从命令行调用来创建这个包.
我想在Windows下执行此操作的原因是我们有一个脚本可以为几个不同的平台构建安装程序,并且已经为windows配置了所有内容,所以我想避免将所有内容迁移到Linux的痛苦.
你知道怎么能实现这个目标吗?
编辑:我使用单独的Linux机器来做到这一点.我使用scp任务复制所有文件,然后使用ssh任务远程执行rpm命令.如果此任务返回成功代码,则使用scp将结果rpm复制回来.
我有两个盒子用于构建源rpm.其中一个运行:
/usr/lib/rpm/find-debuginfo.sh /usr/src/redhat/BUILD/name-of-package
Run Code Online (Sandbox Code Playgroud)
它将三个name.debug文件添加到RPM_BUID_ROOT.
另一个构建框不运行find-debuginfo.sh并且不生成这些文件.
find-debuginfo.sh办?我已将我的应用程序打包到RPM包中,比如myapp.rpm.在安装此应用程序时,我希望收到用户的一些输入(输入的示例可能是 - 安装应用程序的环境 - "dev","qa","uat","prod").根据输入,应用程序将安装相应的文件.有没有办法在安装应用程序时传递参数?
PS:可能的解决方案是为每个环境创建一个RPM包.但是,在我们的场景中,这不是一个可行的选择,因为我们有大约20个环境,我们不希望为同一个应用程序提供20个不同的包.
我在Hudson建立了一个C项目进行了很好的构建,我还有一个.rpm规范文件,用于从这些源创建rpms.
有没有人有任何使用Hudson构建rpms的经验?
现在,我看到的唯一解决方案是设置一个运行脚本的作业,该脚本检查svn导出源,创建tarball并完成整个rpm构建.这似乎与Hudson没有很好的整合 - 例如我如何收集工件?
是否有可能使rpmbuild在包装上保留符号链接?
目前的行为是创建文件的副本,我想避免.
如果我在%文件中有这一行:
%attr(0555, myuser, myuser) /opt/myapp/lib/my.jar
Run Code Online (Sandbox Code Playgroud)
然后my.jar将myuser作为所有者,但目录/ opt/myapp/lib将由root用户拥有.我不想写
%attr(0555, myuser, myuser) /opt/myapp/lib/
Run Code Online (Sandbox Code Playgroud)
因为我不希望包含/ opt/myapp/lib /中的所有文件.
如何为/ opt/myapp/lib /目录设置所有者?
谢谢.