openSUSE:Packaging Java
构建服务教学 - 技巧和花样 - 跨发行版打包 - Debian 打包指南 - 打包检查
桌面菜单分类 - 打包常用的 RPM 宏 - 小脚本片段 - SysVinit 脚本 - 源代码服务
OBS 打包互助问答 - 打包黑名单
目录
(Build)Requires
Java(指的是通常的运行环境,编译器等的捆绑包)分为 JRE - Java 运行环境和 JDK - Java 开发工具集。第一个包含 java 命令,该命令被 Java 应用程序运行所需要。由于 SUSE 遵守 jpackage.org 兼容的命名方式,运行环境的包叫做 java。SDK 使用 java-devel。两者都是有版本号的,因此您可以限制使用的 Java 的最低版本。很显然您需要区分 GNU Java 和其它的 Java,通常情况下,您需要大于 1.5.0 版的 Java(为了排除掉 gcj)。
BuildRequires: java >= 1.6.0 Requires: java >= 1.6.0
这样根据产品版本的不同而展开成不同的软件包。禁止使用全名,因为那样每次 Java 更新后都会破坏依赖关系。
启动程序
通常,java 应用程序不提供用于从命令行启动应用程序或用于桌面文件/图标的启动脚本。 这种情况您可以在 spec 文件的 %install 部分使用如下代码片段。
# startscript
cat > %{name} << 'EOF'
#!/bin/sh
#
# <Program Name> startscript
#
echo Starting %{name} version %{version} ...
echo with options : \${@}
java -jar %{_datadir}/%{name}/%{name}.jar \${@}
EOF
然后用下面两行将脚本安装到 /usr/bin
install -d -m 755 %{buildroot}%{_bindir}
install -m 755 %{name} %{buildroot}%{_bindir}/
现在您就可以从命令行通过名字启动程序以及在桌面文件中使用该脚本了。
Java 版本
Sun Java
Sun Java 在标准仓库中没有(甲骨文改了协议,不再是自由软件了),因此您必须添加 NonFree 仓库,里面含有 Sun JDK。输入
osc meta prj [your project] -e
然后添加仓库
<repository name="openSUSE_11.3">
<path project="openSUSE:11.3" repository="standard"/>
<!-- the NonFree repository -->
<path project="openSUSE:11.3:NonFree" repository="standard"/>
...
Java 软件仓库
- Java:packages - 所有 Java 软件包的开发源,您可以在这里找到最新版
- Java:openjdk6:Factory - openjdk 的开发仓库
- Java:jpackage-1.7 - http://jpackage.org/ 项目的 SuSE 移植
- Java:jpackage-5.0 - http://jpackage.org/ 项目的 SuSE 移植
- Java:jpackage-6.0 - http://jpackage.org/ 项目的 SuSE 移植
示例
标准应用程序
我们以 "columba" 为例,它是一个完全用 Java 写的电子邮件客户端。spec 文件示例如下。
columba.spec
Name: columba
Summary: eMail client written in Java
Version: 1.4
Release: 1
License: GNU General Public License (GPL)
Group: Productivity/Networking/Email/Clients
Source: http://prdownloads.sourceforge.net/columba/columba-%version-src.zip
URL: http://www.columbamail.org
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires:unzip
BuildRequires:update-alternatives java-1_5_0-sun-devel
BuildRequires:ant
Requires: java >= 1.5.0
BuildArchitectures: noarch
%description
Columba is an Email Client written in Java, featuring a user-friendly
graphical interface with wizards and internationalization support. Its
a powerful email management tool with features to enhance your
productivity and communication.
So, take control of your email before it takes control of you!
Feature Highlights
* Clean and Response User Interface
* Cross Platform
* Internationalization
* Unlimited Functionality using Plugins
* Safe and Secure
* Glueing together Third-Party Tools
* Multiple Accounts and Profiles
%prep
%setup -qn columba-%version-src
# remove the third party jars
find . -type f -iname "*.jar" -delete
%build
%ant jar
%install
# jars
install -dm 0755 "%buildroot/%_datadir/%name"
install -m 0644 columba.jar "%buildroot/%_datadir/%name/"
# lib
#install -dm 0755 "%buildroot/%_datadir/%name/lib/jpa"
#install -m 0755 lib/jpa/* "%buildroot/%_datadir/%name/lib/"
cp -rp lib "%buildroot/%_datadir/%name/"
install -dm 0755 "%buildroot/%_datadir/%name/native"
cp -rp native/linux "%buildroot/%_datadir/%name/native/"
install -dm 0755 "%buildroot/%_datadir/%name/plugins"
cp -rp plugins/* "%buildroot/%_datadir/%name/plugins/"
# startscript
install -dm 0755 "%buildroot/%_bindir"
cat >"%buildroot/%_bindir/%name" << EOF
#!/bin/sh
exec java -jar "%_datadir/%name/%name.jar"
EOF
chmod 0755 "%buildroot/%_bindir/%name"
%files
%defattr(-,root,root)
%doc AUTHORS CHANGES LICENSE README
%_bindir/%name
%_datadir/%name
%changelog
Java 库
columba 是一个独立应用程序。打包库又有点差别。下面 Java 库架子派生自 jpackage.org 的 spec 文件。向 %{_javadir} 这样的宏变量的细节可以参考 openSUSE:Java_RPM_Macros。jpackage-utils 里的一些供编译和运行使用的便利脚本的描述在 openSUSE:Java_jpackage-utils。
### the skeleton for packaging of the java libraries
### many of these techniques are based on approach of jpackage.org spec files
Name:
Version:
Release:
Summary:
Group: Development/Libraries/Java
License:
URL:
Source:
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildArchitectures: noarch
BuildRequires: java-devel
BuildRequires: ant
BuildRequires: jpackage-utils
%description
### Many of Java packages contains a javadoc and this is universal notation
### usefull for majority of Java packages
%package javadoc
Summary: Javadoc for %name
Group: Development/Libraries/Javam
%description javadoc
This package contains a javadoc.
%prep
%setup -q
# remove all third party jars
find . -type f -iname "*.jar" -delete
### Many of Java software comes from Windows, so this sed edit the files with
### Windows encoding - the shell scripts probably not works with the Windows end of lines!
#perl -i -pe 's{\r\n$}{\n}gs'
%build
### Sometimes is necessary to set the CLASSPATH before build
### build-classpath is a standard tool from jpackage-utils
#export CLASSPATH=$(build-classpath foo)
%ant
%install
### create of the directory for installing the jars
install -dm 755 "%buildroot/%_javadir"
# jars
### make name of jars version agnostics
(cd "%buildroot/%_javadir/%name" && for jar in *-%{version}*; do ln -sf "$jar" "${jar/-%version/}"; done)
# javadoc
install -dm 755 "%buildroot/%_javadocdir/%name-%version"
cp -pr api/* "%buildroot/%_javadocdir/%name-%version/"
%files
%defattr(-,root,root)
%_javadir/%{name}*.jar
%files javadoc
%defattr(-,root,root)
%_javadocdir/%name-%version
%changelog
第三方 jars
Java 上游将库以 jar 的形式放到源代码归档里。这种方式是偏向于开发者的,因为他们倾向于快速编译项目而不需要去下载或编译全部依赖文件。由于平台独立性的关系,使用这些二进制 jar 是没有任何问题的。但是这对于软件包维护者来说就不是很有用了,对于 Linux 发行版来说更方便的方式是使用系统级别的 jar(位于 /usr/share/java)来编译和运行。只有极少数情况下才无法编译发行版自有 jar(比如上游签名过的 jar),但是通常情况下,没有理由使用第三方预编译 jar。
打包外部的预编译 jar 是邪恶的,因为:
- 它们对于只信任自己编译的软件的人来说没用。
- 它们对已经有了这些 jar 的人没用。
- 它们没法跟踪依赖关系。
- 它们让最终的软件包变得很大。
(引自 [jpackage.org:对 Java 开发者的几点要求]
排错
bytecode version error
如果您得到这样的错误
ERROR: the files above contain java bytecode for something later than java 1.5, ERROR: please set the javac target to 1.5 or lower
您应该将目标设定到 1.5
-Dant.build.javac.source=1.5 -Dant.build.javac.target=1.5
针对 maven:
mvn-jpp -Dmaven.compile.target=1.5 -Dmaven.javadoc.source=1.5 ...
或忽略该测试:
export NO_BRP_CHECK_BYTECODE_VERSION=true
在 %install 部分。这个检查对于 SLE 和构建服务上的软件包都是必要的。