Ahoj.

Tento mail sa bude tykat prevazne linuxakov a mal by byt akymsi "stuchancom" 
do diskusie ohladne balikovania java aplikacii na linuxe. Ospravedlnte prosim
jeho roztahanost a chaotickost ( pisal som to narychlo kym to drzim v hlave ).

Bol by som rad, keby sa mi k tomuto mailu vyjadrili java linuxaci, co maju
viac skusenosti s javou a mavenom a zhruba tusia co-to o linuxe.

V linuxovom c++ svete su aplikacie distribuovane (prevazne) v balikoch. Pokial
aplikacia dependuje na nejakych knizniciach ( povedzme libfoo,
apache-commons-io a tak podobne ), tieto su takisto zabalene do samostatnych
balikov a v balickovacom systeme sa vytvori zavislost aplikacie na jej
knizniciach.

To znamena, ze pokial niekto chce nainstalovat FooApp, automaticky sa mu 
nainstaluju libfoo a apache-commons-io.

Pocas baliaceho procesu v lepsich balickovacich systemoch ( napr. debian ) 
baliace scripty automaticky podla zavislosti v .so knizniciach dokazu urcit 
zavislost aplikacie na knizniciach.

U java aplikacii v linuxe je situacia ale zasadne odlisna (podla mojho nazoru 
katastrofalna). Aplikacie sa instaluju akymysi pochybnymi instalatormi, cim 
je znemoznene instalovat inam ako do $HOME, neriesia sa zavislosti a tak 
podobne.

Uz z principu .jar je jasne, ze z neho nie je rozumne mozne urcit zavislosti a 
vsetko sa musi robit rucne. Package maintainer musi rucne zistit zavislosti ( 
googlom, skumanim kodu atd ), povyrabat rucne descriptory balikov, vyrobit
baliky, rucne nastavit zavislosti, rucne vyrobit spustaci script, otestovat 
to ...
Hrozna praca.

V java svete dost casto narazam na situaciu, ze kazda aplikacia si so sebou 
taha kompletny bundle kniznic. Mne to pride typicky windowsacke, pretoze ta 
napodobenina OS skutocne nema ziaden rozumny dependency management.
Dochadza tym ale k obrovskemu plytvaniu a chaosu. V linuxe by sa to ale malo 
riesit cestou zdielania zdrojov (kiniznic).

Odskok bokom:
U javistov som sa stretol s nazorom, ze je to tak dobre, pretoze nemoze dojst 
k roznym chybam plynucim z moznej nekompatibility. Podla mojho nazoru ale 
situacia nie je tak horuca, pretoze od toho tu predsa mame cislovanie verzii,
z ktorych sa da urcit, ci je api kniznice spetne a dopredne kompatibilne s
pozadovanym stavom. Pokial sa toto cislovanie dodrzi, problem odpada.

Navrat:
Casom ako sa zoznamujem s mavenom, silne mi to pripomina zavislosti v 
linuxovych balikoch. A tak sa mi vnukla myslienka, ci nevyuzit jeho 
dependency management na akesi "automaticke" vytvorenie linux balikov z 
mavenizovaneho projektu.

Samotny maven nepomoze, pretoze riesi len vyvoj, nie dalsi zivot aplikacie. Na 
samotne spustenie aplikacie je bud potrebne mat k dispozicii potrebne jar-y 
niekde na disku, alebo assemblovat zavislosti spolu s aplikaciou ( co zase 
naburava celu ideologiu a nafukuje aplikaciu o megabajty chaosu), programovat 
spustacie scripty a tak podobne. Jeho /dependencies/dependency by sa dal 
lahko vyuzit.

Priklad:

    <groupId>net.test</groupId>
    <artifactId>MyLibrary</artifactId>
    <packaging>jar</packaging>
    <version>2.0</version>

Z tychto informacii dokazem vytvorit meno linuxoveho 
baliku "MyLibrary-2.0.deb", to je prvy krok.
Pokial by som vyriesil, aby mvn install neinstaloval do ~/.m2, ale napr. 
do /usr/local/java/maven/, mohol by som po mvn install rovno vysledok zabalit 
a balik by bol hotovy.

Vysledok:

usr
  local
    java
      maven
        repo
          net
            test
              MyLibrary
                2.0
                  MyLibrary-2.0.jar
                  MyLibrary-2.0.pom


Nasledne by bolo mozne z nasledovnej aplikacie vyrobit dalsi 
balik "MyApplication-1.0.deb" s podobnou stromovou strukturou.

    <groupId>net.test</groupId>
    <artifactId>MyApplication</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>net.test</groupId>
            <artifactId>MyLibrary</artifactId>
            <version>2.0</version>


Kedze pom.xml ma dependencies, slo by v zavislostiach -baliku- urcit, ze 
zavisi na MyLibrary-2.0.deb. Takisto by sa mohlo z pom-u ziskat main-class a 
vyrobit spustaci script:

#!/bin/bash
java -cp /usr/local/java/maven/repo/net/test/MyLibrary/2.0/MyLibrary-2.0.jar 
/usr/local/java/maven/repo/net/test/MyApplication/1.0/MyApplication-1.0.jar 
net.test.Main

Nasledne by po instalacii MyApplication doslo k automatickej instalacii 
MyLibrary a vytvoreniu scriptu co aplikaciu spusti.

Vysledok:

usr
  local
    bin
      myapplication (.sh)
    java
      maven
        repo
          net
            test
              MyLibrary
                2.0
                  MyApplication-1.0.jar
                  MyApplication-1.0.pom



Teraz by este bolo dobre nejakym sposobom spristupnit repozitar v /usr pre 
java vyvojara tak, aby mohol pouzivat kniznice z balikov.

Pokial ma maven moznost pouzivat 2 lokalne repozitare ( musim overit ), mohol 
by pouzivat ~/.m2 klasicky ako doteraz a k tomu este projekty z /usr ako 
projekty distribuovane spolu z linuxom.

A bolo by to vyriesene. Pokial by niekto programoval java aplikaciu na linuxe, 
ktora by pouzivala napr. commons-logging, stacilo by mu spustit:

aptitude install apache-commons-logging, vyvinut danu aplikaciu,
zabalit ju (nejak automaticky, napr. maven pluginom ) do .deb baliku a 
distribuovat. Pokial si ju bude chciet niekto iny nainstalovat, automaticky 
sa mu nainstaluju commons-logging a moze ju zacat hned pouzivat.


Co si o tomto celom myslite?



-- 
Dusan


... tykajte mi

Odpovedet emailem