openSUSE:Packaging Java

Μετάβαση σε: πλοήγηση, αναζήτηση
To Πακετάροντας Java είναι μία εισαγωγή βήμα προς βήμα στο πώς να κατασκευάσετε πακέτα λογισμικού εφαρμογών και βιβλιοθηκών γραμμένων σε Java για το openSUSE και άλλους με τη χρήση του openSUSE Build Service.

(Build)Requires

Η Java συχνά χωρίζεται στα JRE - Java Runtime Environment και JDK - Java development kit. Το πρώτο περιέχει την εντολή java και απαιτείται για την εκτέλεση των εφαρμογών Java. Στο SUSE το JRE παρέχεται από το πακέτο java-1_6_0-%{origin}, όπου origin αντικαθίσταται από sun, openjdk (και ibm ή bea για τα προϊόντα SLES). Το JDK βρίσκεται στο java-1_6_0-%{origin}-devel.

Μιας και όλες οι εκδόσεις είναι συμβατές (ειδικά η sun και η openjdk), δεν έχει σημασία ποια χρησιμοποιείτε. Η καλύτερη πρακτική είναι να μην απαιτείτε συγκεκριμένο προμηθευτή, αλλά να χρησιμοποιείτε τα κοινά σύμβολα που ορίζονται στο έργο http://jpackage.org .

  • Τα java, ή jre είναι σύμβολα που χρησιμοποιούνται για την εξάρτηση στο JRE κατά το χρόνο εκτέλεσης. Αν χρειάζεται να ορίσετε την ελάχιστη έκδοση, το κάνετε με >= 1.6.0
  • Το java-devel είναι ένα σύμβολο για το JDK και επεκτείνεται στο openjdk στις περισσότερες περιπτώσεις. Αυτό μπορεί να αλλάξει στο prjconf του έργου με τη χρήση του Prefer: java-1_6_0-sun -java-1_6_0-openjdk

Εκδόσεις 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, μπορείτε να βρείτε εδώ τις πιο πρόσφατες εκδόσεις για το Factory
  • Java:openjdk6:Factory - έργο ανάπτυξης για το openjdk
  • Java:jpackage-1.7 - Η μεταφορά από τη SUSE του έργου http://jpackage.org/
  • Java:jpackage-5.0 - Η μεταφορά από τη SUSE του έργου http://jpackage.org/
  • Java:jpackage-6.0 - Η μεταφορά από τη SUSE του έργου http://jpackage.org/

Παραδείγματα

Μια αυτόνομη εφαρμογή

Ως παράδειγμα, θα χρησιμοποιήσουμε το "columba", ένα πελάτη ηλεκτρονικού ταχυδρομείου που είναι γραμμένος πλήρως σε Java. Ένα παράδειγμα αρχείου spec-file μπορείτε να δείτε παρακάτω.

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 -q -n "columba-%{version}-src"

# remove the third party jars
find . -iname '*.jar' | xargs rm -rf

%build
%ant jar

%install
# jars
%__install -d -m 0755 "%{buildroot}%{_datadir}/%{name}"
%__install -m 0644 columba.jar "%{buildroot}%{_datadir}/%{name}/"

# lib
#%__install -d -m 0755 "%{buildroot}{_datadir}/%{name}/lib/jpa"
#%__install -m 0755 lib/jpa/* "%{buildroot}%{_datadir}/%{name}/lib/"
%__cp -rp lib "%{buildroot}%{_datadir}/%{name}/"

%__install -d -m 0755 "%{buildroot}%{_datadir}/%{name}/native"
%__cp -rp native/linux "%{buildroot}%{_datadir}/%{name}/native/"

%__install -d -m 0755 "%{buildroot}%{_datadir}/%{name}/plugins"
%__cp -rp plugins/*  "%{buildroot}%{_datadir}/%{name}/plugins/"

# startscript
%__install -d -m 0755 "%{buildroot}%{_bindir}"
cat > "%{buildroot}%{_bindir}/%{name}" << EOF
#!/bin/sh
exec java -jar %{_datadir}/%{name}/%{name}.jar
EOF
%__chmod 0755 "%{buildroot}%{_bindir}/%{name}"

%clean
%__rm -rf "%{buildroot}"

%files
%defattr(-, root, root)
%doc AUTHORS CHANGES LICENSE README
%{_bindir}/%{name}
%{_datadir}/%{name}

%changelog
* Wed Nov 14 2007 - PACKAGERNAME@opensuse.org
- initial RPM for columba on openSUSE 


Μια βιβλιοθήκη Java

Το columba ήταν μια αυτόνομη εφαρμογή. Για το πακετάρισμα των βιβλιοθηκών, υπάρχουν ορισμένες διαφορές. Ο ακόλουθος σκελετός για τις βιβλιοθήκες Java προέρχεται από τα αρχεία spec του jpackage.org. Υπάρχουν ορισμένες ειδικές μακροεντολές όπως η %{_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 . -iname '*.jar' | xargs rm -rf

### 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!
#sed -i -e 's/.$//'

%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} -d -m 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} -d -m 755 %{buildroot}/%{_javadocdir}/%{name}-%{version}
%{__cp} -pr api/* %{buildroot}%{_javadocdir}/%{name}-%{version}

%clean
%{__rm} -rf %{buildroot}

%files
%defattr(-,root,root,0755)
%{_javadir}/%{name}*.jar

%files javadoc
%defattr(-,root,root)
%{_javadocdir}/%{name}-%{version}

%changelog

Αρχεία jar τρίτων

Το Java upstream συμπεριλαμβάνει βιβλιοθήκες ως jars στις πηγαίες αρχειοθήκες. Αυτή η προσέγγιση έχει το σκοπό της για τους προγραμματιστές, που τείνουν να κατασκευάζουν στα γρήγορα τα έργα τους χωρίς την ανάγκη να κατέβουν/ή να μεταγλωττιστούν όλα τα αρχεία εξαρτήσεων. Λόγω της ανεξαρτησίας της πλατφόρμας δεν υπάρχει πρόβλημα στη χρήση των δυαδικών jars. Αλλά δεν είναι και πολύ χρήσιμο στους συντηρητές των πακέτων και η συνήθη προσέγγιση σε διανομές Linux είναι χρήση των jars του συστήματος (ευρέως τοποθετημένα στο /usr/share/java) για την κατασκευή και για το χρόνο-εκτέλεσης. Υπάρχουν ορισμένες ειδικές περιπτώσεις (πχ. υπογεγραμμένα jars) που δεν είναι δυνατή η κατασκευή του δικού σας jar, αλλά γενικά, δεν υπάρχει λόγος να χρησιμοποιούνται τα δυαδικά τρίτων.

Η συμπερίληψη εξωτερικών δυαδικών είναι κακή γιατί:

  • Είναι άχρηστα σε όσους εμπιστεύονται μόνο λογισμικό κατασκευασμένο από αυτούς.
  • Είναι άχρηστα σε όσους τα έχουν ήδη αυτά τα δυαδικά.
  • Καθιστά την ιχνηλάτηση των εξαρτήσεων εφιάλτη.
  • Καθιστά μεγαλύτερες τις αρχειοθήκες.

(από το [jpackage.org:Αίτημα στους προγραμματιστές Java]


Αντιμετώπιση προβλημάτων

Σφάλμα στην έκδοση του bytecode

Αν λάβατε ένα σφάλμα

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 αλλά για πακέτα στο Build Service μπορεί να κατασταλεί.