- Java/HOWTO
- Общие указания по сборке
- Сборка в hasher требует /proc
- Шаблоны spec-файлов
- Определение типа сборочной системы
- Сборка с помощью ant
- %prep
- %build
- %install
- Сборка с помощью ivy
- Сборка с помощью maven1
- Сборка с помощью maven2
- Советы
- Java/OracleSDK
- NOSRC In a Nutshell
- Примечания
- Ссылки
- Переключение на Oracle JDK
Java/HOWTO
Прежде чем читать данный документ, необходимо ознакомиться с ALT Linux Java Policy и JPackagePolicy. Оригинал JPackagePolicy можно найти в пакете jpackage-utils (в сизифе или на www.jpackage.org). Также доступен Перевод JPackagePolicy на русский.
Общие указания по сборке
Сборка в hasher требует /proc
добавьте allowed_mountpoints=/proc в /etc/hasher-priv/system и —mountpoints=/proc в параметры hasher.
В противном случае попытка сборки в hasher приведет к ошибкам вида:
/usr/lib/jvm/java/jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory error: Bad exit status from /usr/src/tmp/rpm- tmp.68276 (%prep)
. checking whether to build with Java support. yes checking for java. /usr/bin/java checking the installed JDK. configure: error: JDK is too old, you need at least 1.5 .
(configure не заметил, что /usr/bin/java завершился аварийно).
Шаблоны spec-файлов
JPackage Spec Template — шаблон spec-файла для java-приложений из JPackage, адаптированный для сизифа.
javalib Spec Template — шаблон spec-файла для java-библиотеки, собираемой с помощью ant.
Определение типа сборочной системы
Тип сборочной системы можно определить по файлам в корневом каталоге проекта.
Наиболее распространённые системы сборки:
Файл | Сборочная система |
---|---|
build.xml | ant |
maven.xml | maven1 |
pom.xml | maven2 |
ivy.xml | ivy+ant |
Существуют и другие системы сборки для java, но из-за их редкости здесь они рассматриваться не будут.
Сборка с помощью ant
%prep
Обычно проекты на ant таскают с собой готовые собранные сторонние библиотеки, необходимые для сборки. Все эти библиотеки необходимо удалить
find . \( -name '*.jar' -or -name '*.zip' \) -exec rm -f <> \;
find . \( -name '*.jar' -or -name '*.zip' \) -exec mv <> <>.no \;
Пакеты не должны использовать при сборке эти готовые сторонние собранные библиотеки, а должны использовать вместо них библиотеки, собранные в Сизифе. Если какой-то готовой сторонней собранной библиотеки в Сизифе нет, ее необходимо сначала туда собрать.
Пусть, например, до удаления ls ./lib показывало
ls ./lib commons-cli.jar xerces-j.jar
Нам нужно использовать вместо них библиотеки, собранные в Сизифе. Для этого установим в сборочную среду пакеты jakarta-commons-cli и xerces-j2. теперь добавим в проект вместо удаленных библиотек ссылки на библиотеки из Сизифа.
ln -s $(build-classpath commons-cli) ./lib/commons-cli.jar ln -s $(build-classpath xerces-j2) ./lib/xerces-j.jar
Заметим, что в Сизифе jar называется xerces-j2.jar, но в проекте ожидается xerces-j.jar.
При создании символической ссылки мы использовали скрипт build-classpath пакета jpackage-utils. Например, $(build-classpath commons-cli) расскрывается в /usr/share/java/commons.cli.jar. Возникает вопрос, зачем использовать build-classpath, если можно просто написать
ln -s /usr/share/java/commons.cli.jar ./lib/commons-cli.jar
Ответ — /usr/share/java только одно из мест, где может лежать библиотека. build-classpath просматривает все эти места, а также учитывает различия в JVM. Например, build-classpath xml-commons-apis выдаст /usr/share/java/xml-commons-apis.jar под java-1.4.2-sun и ссылку на tools.jar (стандартную библиотеку JVM) под java-1.5.0-sun. Места, в которых ищется библиотека, детально описаны в JPackagePolicy.
%build
смотрим в build.xml, какие там есть цели. Нужная цель скорее всего будет одной из
ant all ant jar javadoc ant dist
Для небольших проектов можно не заниматься наполнением ./lib, а просто перечислить все необходимые библиотеки в переменной CLASSPATH:
export CLASSPATH=%(build-classpath commons-cli xerces-j2) ant -Dbuild.sysclasspath=first dist
В build.xml должны быть заданы параметры компилятора source и target. Если они не заданы, то их лучше указать явно при вызове ant. Например,
ant -Dant.build.javac.source=1.4 -Dant.build.javac.target=1.4
Поскольку в сизифе минимальная версия java это 1.4.2, гнаться за значениями source и target, меньшими, чем 1.4, не имееет особого смысла. Если же исходники используют диалект java5, придется указать
ant -Dant.build.javac.source=1.5 -Dant.build.javac.target=1.5
Это позволит иметь код, совместимый с java5 (java4), даже если при компиляции использовался java6.
Если компиляция завершилась аварийно с сообщением вида
[javac] javac: source release 1.4 requires target release 1.4
Это означает, что в build.xml в разделе значение target уже указано, при чем отличное от 1.4. Тогда -Dant.build.javac.source=1.4 -Dant.build.javac.target=1.4 можно опустить либо согласовать с тем, которое указано в build.xml. Как правило, лучше согласовать.
Заметим, что для вызова ant есть специальный макрос
Раскрывающийся в «установить JVM и вызвать ant». В текущем Сизифе использовать этот макрос не обязательно, но «на всякий случай» рекомендуется.
%install
Внимательно перечитайте JPackage Policy.
- устанавливайте arch-и jvm -независимые публичные jar в %_javadir, arch-зависимые в %_jnidir, jvm-specific в %_javadir-ext.
- не забудьте %name-%version.jar.
- Создавайте симлинк %name.jar и симлинки с другими употребительными именами. Пример
pushd $RPM_BUILD_ROOT% for jar in *-%*; do ln -sf $ `echo $jar| sed "s|jakarta-||g"`; done for jar in *-%*; do ln -sf $ `echo $jar| sed "s|-%||g"`; done popd
- Для больших проектов создавайте поддиректорию %_javadir/%name/.
- Если приложению нужно приватное дерево, размещайте его в %_datadir/%name/.
Сборка с помощью ivy
Вам крупно повезло. Сочуствую.
Сборка из src.rpm не должна лазить в интернет за внешними файлами. И не факт, что это будет разрешено в сборочнице Сизифа.
Можно, конечно, пытаться обмануть ivy самодельным локальным репозиторием, но чем отучать ivy, гораздо проще глазами просмотреть ivy.xml файлы, собрать вручную нужный CLASSPATH=, выдрать с корнем упоминания ivy из build.xml файлов (см. как пример, chainedoptions-0.9.0-alt-kill-ivy.patch).
После этого сборка сводится к сборке с помощью ant. Только не забудьте ткнуть ant носом в ваш CLASSPATH, например, через
Сборка с помощью maven1
maven1 является устаревшим, и новые проекты мигрируют на maven2. Поэтому сборка с помощью maven1 рассматриваться не будет.
При необходимости рекомендуется найти в Сизифе пакеты с
BuildRequires: maven-plugins
и провести сборку, используя найденные пакеты как пример.
Сборка с помощью maven2
Советы
# Out of memory # for PermGen error, running out of memory export MAVEN_OPTS=-XX:MaxPermSize=512m export MAVEN_OPTS="-Xmx256m" -Dmaven.javadoc.additionalparam=-J-Xmx256m # skip tests -Dmaven.test.skip=true -Dmaven.test.skip.exec=true #List of ant patterns (spared by commas) used in test:match goal to specify the tests that shouldn't run -Dtestnotmatchpattern='*' -Dtestnotmatchpattern='Hey*,Joo*. Kaa*' -Dmaven.compile.target=1.4 -Dmaven.javadoc.source=1.4 an example how to install missing jar file manually #-------------------------------------------------------------- # Mock objects is sort of a special case since it does not reside in # /usr/share/java. So we install it manually via maven. export MAVEN_REPO_LOCAL=$(pwd)/.m2/repository mkdir -p $MAVEN_REPO_LOCAL mvn-jpp install:install-file \ -Dmaven.repo.local=$MAVEN_REPO_LOCAL \ -DgroupId=mockobjects \ -DartifactId=mockobjects-jdk1.4-j2ee1.3 \ -Dversion=0.09 \ -Dpackaging=jar \ -Dfile=$(build-classpath mockobjects-jdk1.4-j2ee1.4)
Java/OracleSDK
jdk-6u26-linux является последним фирменным JDK, распространяемым под лицензией DLJ (Operating System Distributor License for Java version 1.1). Эта лицензия явно разрешает распространять JDK в составе дистрибутива. Таким образом, java-1.6.0-sun-1.6.0.26 является последним JDK от Sun/Oracle, входящим в состав Sisyphus.
Последующие версии Oracle JDK теперь распространяются под лицензией Oracle Binary Code License, в которой есть явное разрешение распространять JDK вместе с java приложениями, например, в составе LiveCD, но нет явного разрешения распространять JDK в одиночку как отдельный пакет. Поэтому их нет в сизифе.
Однако ничто не мешает установить данные пакеты самостоятельно. Для безболезненной установки Oracle JDK под ALT Linux доступны nosrc.rpm-пакеты. В них собственно Oracle JDK не входит, его нужно отдельно скачать, после чего их можно пересобрать по инструкции ниже и получить обычные rpm-пакеты, готовые к установке.
NOSRC In a Nutshell
Установите его командой вида:
$ rpm -Uhv java-1.8.0-oracle-1.8.0.102-alt1.nosrc.rpm
После выполнения команды у вас появится новый каталог /home/UserName/RPM/ , в нём будет еще два каталога: SOURCES и SPECS
Скачайте в каталог SOURCES/ недостающий исходник jdk*.tar.gz для вашей архитектуры с сайта Oracle (Java SE Downloads, download.oracle.com, если ссылки устареют, поищите новые в google).
Например, для java-1.8.0-oracle-1.8.0.102 это будет файл:
Публикация nosrc.rpm может отставать от выпуска новых релизов java.
Если на сайте Oracle доступна более свежая версия, чем имеющиеся *.nosrc.rpm , необходимо внести поправки в файле java-1.8.0-oracle.spec и только после этого приступать к сборке *.src.rpm .
К примеру: У вас в файле java-1.8.0-oracle.nosrc.rpm в строке %define buildver указана версия 60, а на оф.сайте уже доступна версия jdk-8u72-linux-**.tar.gz ; править нужно следующее: ( «-» — это строка для изменения, «+» — та же строка, но уже с внесенными изменениями)
--- java-1.8.0-oracle.spec~ 2016-02-04 17:31:58.832448223 +0300 +++ java-1.8.0-oracle.spec 2016-02-04 17:02:50.865717944 +0300 @@ -38,7 +38,7 @@ %define origin oracle %define priority 18040 %define javaver %major.%minor -%define buildver 60 +%define buildver 72 %define jppname java-%{javaver}-%{origin} %define javaws_ver %{javaver} @@ -1107,6 +1107,9 @@ %changelog +* Thu Feb 04 2016 Michael Shigorin 0:1.8.0.72-alt1 +- nosrc spec file for java sdk 8u72 + * Fri Oct 09 2015 Igor Vlasenko 0:1.8.0.60-alt1 - nosrc spec file for java sdk 8u60
Обновить nosrc.rpm при желании можно подобным образом:
rpmbuild -bs --nosource 0 --nosource 1 --nodeps java-1.8.0-oracle.spec
Далее установите в host-систему пакеты rpm-build-java browser-plugins-npapi-devel и в каталоге SPECS/ выполните команду (для Oracle JDK 8):
$ rpmbuild -bs --nodeps java-1.8.0-oracle.spec
Полученный в результате java-1.8.0-oracle-1.8.0.102-alt1.src.rpm пересоберите в hasher.
Примечания
ключ » —nodeps » команды «rpmbuild -bs» позволяет выполнить ее без установки лишних зависимостей в хост-систему.
При этом, если в хост-системе не будет некоторых дополнительных пакетов с макросами, именно, указанных в BuildRequires(pre): rpm-macros-alternatives browser-plugins-npapi-devel , то rpmbuild будет выдавать предупреждения, связанные с отсутствием соответствующих макросов. На это можно не обращать внимания, если сборка src.rpm пакета состоялась.
Если вы не осилили сборку в hasher, то надо делать так
cd /home/user/RPM/SPEC rpmbuild -bs --nodeps java-1.8.0-oracle.spec cd /home/user/RPM/SRPMS apt-get build-dep путь_до_файла/java-1.8.0-oracle-1.8.0.31-alt1.src.rpm cd /home/user/RPM/SPEC rpmbuild -bs java-1.8.0-oracle.spec
При этом в систему установятся пакеты, необходимые для сборки пакета. После сборки, их можно удалить из системы.
В последней версии java-1.8.0-oracle.spec для JDK 8u45 (arch type i586), надо запретить сборку moz_plugin_classiс для 32-битной архитектуры (как уже сделано для 64-бит)
@@ -84,7 +84,7 %else %def_enable javaws %def_enable moz_plugin -%def_enable moz_plugin_classic +%def_disable moz_plugin_classic %def_enable desktop %endif %def_with gcc32_abi
Ссылки
Переключение на Oracle JDK
Удалите пакеты java-*-openjdk.
TODO: использование alternatives
Вопрос: как при выполнении rpmbuild -bs —nodeps java-1.8.0-oracle.spec на выходе получить упакованный пакет с сорцами i586 при сборке на платформе x86_64. Упаковывается всё x64.tar.gz