A következő címkéjű bejegyzések mutatása: maven. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: maven. Összes bejegyzés megjelenítése

2012. január 19., csütörtök

maven, java... és a linux!

Ma tartottam egy prezentációt a Red Hat-nél a maven-ről. Jajj, már megint a maven, már vagy a negyedik vagy ötödik eddig életemben. Nekem már kicsit unalmas, de úgy gondoltam ezzel tudnék segíteni a legtöbbet a projectemnek. Persze megpróbáltam új nézőszögből, hátha úgy jobban átjön. Ugyanis maven-t használunk, de nem vagyunk egészen boldogok. Meg is érdemeljük szerintem, de ne aggódjatok értem, rajta vagyok!

Mindenesetre a srácok felének annyi köze van a java programozáshoz, mint nekem az ABAPhoz. "Aha, láttam már olyat!" A Red Hat csákók túlnyomó része nyilván kemény linuxer, égget scriptszag terjeng a levegőben, commandlineokban gondolkodnak, satöbbi. Na és a maven dependency resolution dolgára keményen beszólt egy srác, hogy nem akarnak jar fileokat letölteni a maven repositorykból, jöjjön szépen a buildhez a jar file egy szép csomagból az yum repositoryból. Oszt csókolom.
Elmondtuk neki -többen is-, hogy hát vannak még olyan srácok a világon, akik nem fedorát használnak. Ezzel nem akartam megsérteni de ők vannak azért többen, nekem oké a fedora. Is... akár... Szóval mit mondjunk a java fejlesztők és felhasználók többségének?

Sajnálom ez a java program nem fordul le Windows 7/OS-X/MyPetLinux operációs rendszeren, mert még nem csinálták meg a függő jar fileokat tartalmazó exe/msi/dll/rpm/deb/tgz/ fileokat az ő rendszerére.
(Osx-hez mi is a csomagolás? Na mindegy...)

Aztán meg mi java fejlesztők még mindig ott tartunk, hogy a java alkalmazás operációs rendszertől független amennyiben nem csesszük el ugye, és ezt előnyként értékeljük. Ugyanis bátran fel tudod upgradelni a linuxodat a legfrisebb linuxra, a java alkalamzásod még mindig ugyanazt fogja tenni. legalábbis jó eséllyel, de egy rendszer upgrade semmiképpen sem olyan seggfájás, mint ha OS-függő lenne. Ez egy üzleti alkalmazásnál szvsz rohadtul fontos. Míg ha a függűségeidet pl RPM-be csomagolod, a következő rendszer upgrade esetleg agyoncsapja az alkalmazásodat. Oszt csókolom.

Mit szólnál ha ezzel köszöntene reggel a rendszeradminod?
Hoppá, kicseréltem a hibernate-t az alkalmazásod alatt 4.x-re, maradhat?
Megijednél kicsit, nem? :-)

Azért egy pár sráccal beszéltem, azt hiszem még egy pár kört beszélgetnünk kell mielött azt mondjuk hogy oké értjük egymást, de rajta vagyok a témán.

Egyébként a prezi itt található. Sajnos a hangminőség csapnivaló volt, meg hát angolul se tudok. Ja meg beszélni se nagyon.

2011. augusztus 17., szerda

Gyárlátogatás: verziószám

Tipikus igény a szoftverekkel szemben, hogy meg tudják mondani a saját verziószámukat. Ez főleg azért kell, hogyha a kedves felhasználó meglát egy bogarat benne, meg tudja mondani, hogy melyik verzióban látta. Legalábbis hogy esélye legyen rá. Erre szedtem össze az általam eddig látott és használt megoldásokat, azzal együt hogy mi a tipikus elba**** velük kapcsolatban. Nemcsak hogy egyik sem tökéletes megoldás, de mindegyik szerintem elég töketlen. Persze a sajátját mindenki szereti :-)

Build script

Ez volt a leggyakoribb. Az ötlet annyi, hogy amikor buildelsz, akkor generáljon neked egy számot bele egy file-ba, amit valószinűleg besúvaszt utánna a classpath-ra. Ezt persze csak inkrementálgatni kell. Láttam olyat, hogy ez a file csak úgy "floating around" azaz akik release-t csináltak azok tudták a számozást, aztán volt olyan hogy visszakommitolták legalább időnként a verziókövetőbe. Ja még ezen belül is két különböző műfaj van, van aki verzió számot tart számon, van aki build számot. Szóval a kombinációk száma igen magas.
A tipikus elba:

  • Amikor nincs meg a file a classpathon, akkor valami törik
  • Elfelejted inkrementálni a build számot
  • Elfelejted a verziószámot bepakolni a verziókövetőbe, mielött tegelsz



Database, config

Olyat is láttam, hogy az emberek a konfigurációba, vagy gyakrabban az adatbázisba írják bele, hogy mennyi a szoftver verziószáma. Az egyébként tetszik, hogy az adatbázisban valahol benne legyen az, hogy milyen patcheket hajtottak végre rajta és milyen verzió satöbbi a jelenlegi schema, de akkor most az operátorra bíztuk, hogy felülbuherálja a verziószámot.
Elba:

  • Azon felül hogy anyukádat emlegetik közben, még rizikó tényező hogy az operátor valamikor visszacsinálja vagy átírja, vagy éppen ellenkezőleg: elfelejti átírni.
  • Az fenti elfelejtések simán ide is passzolnak

SVN-way


Ezt én találtam ki és hát primitív mint a szerzője: Csinálj egy osztályt pl Version néven, tegyél bele egy final static String mezőt, aminek az értéke legyen ennyi: "$HeadURL: http://svn.blf.hu/fubar/trunk/src/main/hu/blf/Version.java $", plusz egy metódust, ami fubar és az src közül kibányássza neked ami ott van: pl ennyi: StringUtils.substringBefore(StringUtils.substringAfter(version, "/fubar/"), "/src/"), ne felejtsd el a végén az svn property-k között a keywords-be beleírni azt hogy "HeadURL".
A build numebert nyilván hanyagolja. Csak azt adjuk oda bárkinek is, amit szépen betegeltünk.
Jó, a nyilvánvaló hátrányok elött felsorolnám hogy miért szerettem ezt:

  • Soha nem sikerült elszúrnom :) A Version osztály mindig valami értelmeset ad vissza. Pl azt hogy "trunk". A legdurvább elcseszés esetén semmit, de nem NullpointerException-t.
  • A release során simán meg lehet róla feledkezni. A release nálam ennyi: mvn release:prepare release:perform (így "howto release" manuált se írtam soha)
  • Ja és ez az egész substringes dolog csak a cicoma rajta, sima statikus text/html fileokkal is működhet, ha érti a felhasználód a HeadURL-t hogy mi az.
Akkor jöjjön a hátrány:
  • Totálisan SVN függő - azért volt ilyen a CVS-ben is, de arra már kiemlékszik
  • Az SVN-re meg most úgy fintorgunk mint a CVS-re úgy 6-7 évvel ezelött. Valahogy akkor jött ki az SVN, nem?
Még annyit a megoldás portolhatóságáról, hogy a git pl nemcsak hogy nem csinálja, de elvben is ellenzi. Linus Torvalds szerint írjál scriptet. Szerintem meg ... :-) Na mindegy, nekem ez nem tetszik, túlságosan könnyen elcseszhető. Meg bújja a git elba manuálját az, akinek nincs jobb szórakozása.

Ennyi... részemről

De kiváncsi lennék a ti tapasztalataitokra, linkeljétek vagy írjátok ide nyugodtan! Köszi előre is!

2010. január 21., csütörtök

JUM XIII

Öregszik a JUM, már a 13. alkalmat tartottuk tegnap este.

Tvik: Scala

Érdekes összefoglaló volt a scala lehetőségeiről, nekem valahogy az volt az érzésem hogy minden említett dolga érdemelne egy külön előadást. A scala-ban egyszerűen túl sokminden van. Magánvélemény, de én kicsit zavarosnak tartom a kulcsszavait, egészen onnantól hogy object, ami egy olyan class, aminek nem lesz példánya, mert csak static metódusok vannak benne. Pedig az object az az osztály egy példánya lenne úgy általánosan OOP-ben, nem? Mindegy, még az olvasásra szánt könyvek sorában várakozik a scala kupac, remélem én is hamarosan többet fogok érteni belőle.

Verhás Péter: Velocitoro maven plugin

Ötlet maven pluginra. Maven plugint hébe-hóba hegesztek én is, (pl a kis jetty-gzip tákolmányom), tényleg majdnem olyan egyszerű, mint ant taskokat írni :-) A velocitoro statikus weboldalak generálására szolgál és így nagyon kevés (kb 0) tapasztalatom van ilyen projectekben, így csak az első impressziómat tudom megosztani: az nem igazán tetszett hogy a java és a groovy kód egybe van a html kódokkal és a velocity templatekkel. Az olyan kis rumli hangulatú dolog.

Auth Gábor: JBoss ESB

Legfőbbképpen ez érdekelt, szó volt a JBoss csodálatos új MQ-járól, ami 5x* lenyomja az ActiveMQ-t, a hiper-optimalizált ESB-jükről, amiben van minden, BPEL és mindenféle. Nem tudom mennyire értem jól a dolgot, üssetek ha marhaságokat hordok össze, de tipikusan arra használja az ember az ESB-t, hogy független rendszereket kössön össze velük. Akkor engem nem annyira a cucc sebessége érdekelne.
Én az ilyen vendor-binding dolgokból szeretek egy kicsit kimaradni. Jó stratégiának tűnik, ha meg akarod úszni a portolást miután az Oracle megvette a JBoss-t :)

*: bizonyos esetekben :-) másokban lehet még lassabb is, gondolom...

2010. január 5., kedd

Maven 404-ek

A todomap.org maven repoját úgy tűnik nem csak én használom, hanem páran mások is, nem tudom kik, az IP címet leszámítva, úgy látszik nálam találták meg amit kerestek. Nem baj, azért tettem oda hogy megtalálják... Viszont ez kiválló alkalmat ad arra, hogy megpróbáljam kielégíteni kiváncsiságomat: vajon mennyi 404-et generál a maven a repository szervereknek?

Az összes request a maven-től:
grep Java *.request.log | wc -l
3796

És ebből a 404:
grep 404.*Java *.request.log | wc -l
3618

Ez legtöbbször azért van, mert egyes artifactokhoz nem talál a maven pom file-t, ezért minden egyes alkalommal megpróbálja beszerezni hozzá, hogy feloldhassa a dependency-ket (hacsak nem -o opcióval hajtjuk éppen, de például continuous integration szerveren tipikusan nem).

Azt is megnéztem hogy szemre mi lehet a leggyakoribb oka a 404-nek: oracle jdbc driver :-) Érdekes listát kaphatnánk a nem maven-barát projectekből, ha nagyobb ismert repo szerverek logjaiba belenéznénk. Talán összeállíthatnánk egy fontossági listát arról hogy mihez lenne érdemes pom-ot hímezni akár kézzel is.

Egyébként nem tudom jól emlékeszem-e, valamikor még a maven 1.x alpha idején volt az ibiblio.org-nak egy félelmetesen hosszú 404 üzenete, amiben többszáz nyelv szlengjében elmondták azt, hogy "nem találom". Magyarul is persze. Hát nem csoda hogy eltünt :-)

2009. november 7., szombat

Mosatanában elkövetett mini-projecteim

Kicsit elhanyagoltam mostanában ezt a blogot és inkább otthon hegesztgetek. Pár némileg újrafelhasználható dolgot is összekopácsoltam az utóbbi pár hétben.

MiniGeoIP

Szóval próbálkoztam azzal, hogyan tudom bemérni a kliens földrajzi helyét. Nem holmi öncélú marketingdolog miatt, hanem egyszerűen hogy az alkalmazás számára releváns infóval tudjon indítani. Egyébként a IP-blokkolás szerintem rasszizmus. Próbálkoztam a Google JSAPI-jával, a tapasztalatok viszont azt mutatták, hogy a Google vagy megmondja hogy hol vagy, vagy nem... Ami azért bár nagyon baráti, de mégsem 100%-os telitalálat. Söt, sajnos úgy tűnt az ismerőseim többségének IP címére nem mond semmit. Keresgetni kezdtem szerver oldalra beágyazható IP feloldást de nem sok használható dolgot találtam, úgyhogy a felgyűlt ihletből gyorsan összedobtam egyet. Ez az implementáció egy 100.000 soros adatbázist épít fel magának. Az még a memóriában is elférne talán, viszont én JPA-n keresztül keresem. Sajnos kényelmes voltam és spring JpaDaoSupport-ra építettem, szóval most totál spring-függő, de ez most még nem fáj nekem. Cucc. Ja és itt ki is lehet próbálni, hogy jó országba tesz-e.

GeoCoder

Hasonlóan föcis téma, egy adott koordinátából szeretnénk megkapni a postai címet amennyire lehet. Unalmas. Google reverse geocoder. Köszi gúgli. Cucc.

Jetty-gzip-plugin

Ez szerintem vicces téma, a jetty default servlete tud olyat (és alapból be is van kapcsolva), hogy ha egy statikus file mellett ott van a .gz tömörített változata, ÉS a kliens nem IE :-D, akkor a tömörített változatot küldi el, ezzel megtakarítva sávszélességet és egy kis időt is. Pl a javascript library-k egészen hatalmasra nőttek. Ez a kis maven plugin egyszerűen packageléskor létrehozza a .gz fileokat. Akár kézzel is megcsinálhatná az ember, ha nem felejtené el mindig. Nekem kicsit több mint 100Kb-t takarít meg egy oldalmegjelenéskor, ennyiért úgy gondoltam, hogy már megéri. Cucc...

Google Translate Java kliens

Hát ez annyit tud, hogy megmondja, milyen nyelven van a szöveg. Teljesen minimalista, de ennyivel beérem. Ismét köszi gúgli. Kicsit már zavar hogy mennyi mindent ráépítek google szolgáltatásokra. Cucc...

Ennyi, köszi ha eddig eljutottál, akkor most megint pár hét lapátolás...

2009. június 21., vasárnap

Rémálom a JPA utcában

Ezt a problémát próbáltam felvázolni Tvik-nek a eclipse democamp elött, de azt hiszem túl alacsonyan volt akkor még az agytevékenységem hogy sikerrel járjak. Meg talán viccnek túl hosszú ez az egész.

Szóval egyik nap áthívott az egyik srác egy másik projecttől, hogy segítsek elindulni a JPA persistence tesztek fejlesztésével a projecthez. Eléggé félfüllel követtem a project életét, szóval igazából csak nagyon kevés ötletem van arról hogy mi miért jutott oda ahol van az architektúra fejlődése során, de ehhez a feladathoz ezen a ponton rendelkezésünkre állt:
  • Netbeans-ben kigenerált JPA controller kód (ahogy én értettem ez ugyanaz mint a DAO pattern)
  • persistence.xml kitöltve a production környezethez (JNDI datasource inside)
  • Azt hiszem szintén generált perzisztens osztályok
  • Maven-es build
Feladat: A kódot teszteljük úgy, hogy használjuk fel hozzá kigenerált kódot is. Szóval sima DAO tesztelés.
A generált kód nemnyúkapiszka tárgya.

Első nekifutásra egyszerűen azt javasoltam a kollégámnak, hogy egyszerűen dobjon be egy új persistence.xml-t a teszteknek, és használja azt a tesztekből. Biztosan lehet valahogy, mert a spring és a unitils is meg tudja mondani a persistence layernek, hogy melyik persistence.xml-t használjuk fel. Mondani könnyű persze.
Párhuzamosan én is elkezdtem keresni, hogy vajon a JPA-nak hogy is kell ezt megmondani, de látványosan sehol semmit nem találtam, csak akkor nem foglalkoztam vele tovább mert persze én másik projecten vagyok és azt kell hegeszteni.

Második nekifutás: Be kellett látnunk hogy kicsit alaposabban kell foglalkozzunk a JPA kérdéssel ahhoz hogy a teszteket élesbe állítsuk. Összeültünk egy eredetileg rövidre tervezett pair programming sessionre és nekiláttunk átnézni a teszt menetet. Hamarosan kiderült hogy a spring valami nagyon hosszú tréfát használ arra, hogy a persistence.xml-t más néven keresse meg és ezt nem akartuk átmásolni tőlük, inkáb az volt az alapötlet, hogy a spring-gel inicializáltatunk egy JPA EntityManager-t és azt odaadjuk az érintett DAO objektumoknak. A JPA init ment is mint a karikacsapás, de amikor odaértünk, hogy beletömjük a DAO objektumokba az eredményt, akkor elmúlt a jókedv: a generált osztályok konstruktora inicializálta és private mezőként tartotta az EntityManagert. Azaz szépen udvariasan nem tudunk hozzányúlni. Ráadásul a kódba bele van generálva a persistence unit neve is. Ezt az egészet úgy látszik úgy találták ki, hogy a végleges környezeten kívül máshol ne lehessen futtatni. Azaz nem tesztelő-barát.

Harmadik nekifutás: Override-oljuk a konstruktort. Ja, de az ősosztály default konstruktora akkor is meghívódik. Rövid roham, fejvesztett menekülés.

Negyedik nekifutás: Jó, akkor használjuk a production-ra szánt persistence.xml-t és mielött mindezt felstartoljuk, dobjunk össze egy JNDI contextet a teszt DataSource objektummal. Ez tűnt vagy fél órán keresztül a nagy és tökéletes ördögi tervnek, én teljesen hittem a sikerben amíg a tesztbe drótoztam a spring-test csomag JNDI mock csomagját és startnál elmondtam a varázsigét is, hogy "Fuss QA!!!".... és nem működött. Azért nem, mert a spring JNDI mock csomaga pár metódust nem implementált a JNDI standardból, amit a JPA implementáció akkor is meg akart hívni. Na igen, régen használtam a spring JNDI implementációját és fogalmam nem volt a korlátairól.

Ötödik nekifutás: diplomáciai tárgyalások az ellenséggel. Ekkor kitaláltuk, hogy akkor a build eszközzel etetjük meg azt, amit a szőrös apikkal nem tudtunk. Nos a maven esetében ha két ugyanolyan nevű resource van a src/test/resources és src/main/resources alatt, akkor úgy tűnik kb véletlenszerűen fogja egyiket vagy másikat megtalálni. Nincs más választás, külön profile-ba kell tenni az éleset és a tesztet.
Ant-tal pofátlanul egyszerű lenne a junitnak odalökni egy másik classloadert. Rettenetes mellékhatások: nem futhat egy buildben a deploy és a teszt. A CI konfiguráció se lesz persze egyszerűbb.

Tanulságok:
  1. Rájöttem hogy eddig soha nem próbáltam spring nélkül JPA apit használni
  2. És valószinűleg ez az oka annak, hogy nem utáltam meg már az elején a JPA-t. A JEE architektúra csak kicsit lett kevésbé toldott-foldott mint a jó öreg EJB 2.1 időkben.
  3. A generált kódoktól nagyon udvariatlan dolog, hogy ők akarják inicializálni a persistencemanagert és erről nem lehet lebeszélni őket.
  4. A JPA-ban már az elején nem tetszett, hogy a META-INF/persistence.xml-hez ennyire ragaszkodik, de nem gondoltam, hogy nincs is szabványos megoldás ennek a felülbírálására.
  5. A netbeans generált kódjaitól ments meg uram mintket!
  6. Amikor ilyen kavar a kód, a maven szigorú struktúrája is akadállyá válik.

2009. június 18., csütörtök

Eclipse DemoCamp frissen

Ma este betértem az Eclipse DemoCamp 2009 rendezvényre, szocializálódni és telepakolni a szatyromat információkkal. A hely egy kellemes kis teázó a vár aljában, a hőmérséklet és a népsűrűség is sokkal kellemesebb volt mint tavaly. Persze nem azért, mert kevesebben voltunk :) Kicsit lassan rázódtam bele a hangulatba, inkáb már csak az első előadás után kezdtem kommunikálni emberekkel.

Előadások...

Bocsi, még mielött nekivágok... Nem próbálom hitelesen visszaadni az előadások tartalmát, az biztosan elérhető lesz majd valahol, a saját reakcióimat írnám le ide velük kapcsolatban.
  • Nagy Gergely: Dependency Management with Ivy and IvyDE
    Demókkal megtűzdelt előadás volt arról, hogy az Ivy-t hogyan lehet fejlesztőbarátabbá tenni egy eclipse plugin segítségével. Volt is benne apróbb bug, egyszerű javítással. Ahol kicsit nekem elakadt a lélegzetem, az a repository modell volt. Miért lett ez ilyen bonyolult?
    Feltettem az a kérdést, hogy ha "csak például :)" én mavent használok, de a cég egy másik csapata ivy-t és ant-ot, tudnak-e ők nekem olyan mavenes descriptort generálni a ivy dependency-kből, amivel az én mavenes projecteim tudják használni az ivy+ant kombinációval buildelt cuccot. Gergely mondta, hogy nincs ilyen megoldás és Jason hozzátette hogy igazából nem is lehet, a két project classloader rendszere teljesen más és összeegyeztethetetlen.

    Kövekeztetés: a Cégen belül ha valaki ilyet használ, az nekem nem segítség. Továbbra is hímezhetem kézzel a pomokat.

  • Jason van Zyl: Next Generation Enterprise Builds: Maven, Mercury and Tycho
    Külföldi sztárelőadóval folytatódott a build eszközök harca :)

    Szóval Jason elegánsan átsiklott a maven 3.0 téma felett, ahol én meglepődtem, mert a maven 3.0-ról most hallottam elösször és nagyon érdekelt volna erről minnél több infó, de ennyit kaptunk: minden működni fog a maven 2.x-ből 3.0-on is.
    A m2eclipse alias Tycho igazán meggyőző demó volt. Persze volt benne pár apróbb hiba, mint minden live demóban, de talán végre eljött az ideje, hogy beálljak a sorba és elfelejtsem az 'mvn eclipse:eclipse' parancsot. Amúgy is túl geek-es volt, windowson meg rettenetes.
    A nexusról nem sok újat tudtam meg, mondjuk azon amennyire tudtam rajta tartottam a szemem. Az első pár feature requestet én dobtam be rá és igazából elégedett vagyok azzal amit kaptam ingyen :) A kérdésem az volt hogy mi az, ami kiemeli a nexus-t a maven repository managerek versenyéből. Jason alapvetően a stabilítást és a teszteltséget emelte ki, valamint hogy az archiva igazából bebukóban van.
    További információmorzsa: a nexus a jsecurity-t használja azonosításra és csak 1 hét volt beintegrálni, ami jobb mint a spring-security. Volt nekem is pár problémám a spring-security-vel, de soha nem szúrtam el rá 1 hetet. A rekord egy régi grails-es projectemen volt 2 estényi gubancolás, mert akkor még a grails is gyerekcipőben járt, meg groovy-ban is az volt az első dolog amit írtam. Házi feladat: jsecurity


    Félig meddig ide tartozik, és a következő blog postom arról fog szólni hogy milyen torkos szívás volt generált JPA kódra írt teszteket futtatni mavennel. Pff, a kódgenerálás a múlt század. Nekem az idl compilerek jutnak róla eszembe.

  • Bánfai Balázs, Török Zsolt: Transition from classroom to real-life software engineering
    Nos ebből a szempontból az én karrierem - ha beszéljetünk ilyenről- nem a szokásos dolog. Soha semmi hasznosat nem tanultam iskolában főleg nem informatikáról, és bár jártam egyetemre, úgy érzem hogy -persze csak intellektuális- pofonokon kívül mást nem kaptam. Persze kell a karó a virág mellé, de hát... kéne a virág a karó mellé.
    Úgyhogy erről kimentem dumálni a teázó elé, aztán pedig hazatekertem.

Köszi a szervezésért és a kajáért a B2 International-os arcoknak!

Sziasztok, boldog csütörtököt!

2009. március 23., hétfő

maven release plugin

Úgy egy éve áttértünk a melóban is maven-re. Igazából ennek nem holmi technikai "megvilágosodás" állt a hátterében, egyszerűen annyi, hogy a főnököm magasabb pozícióba lépett és a technikai jellegű feladatait átadta nekem, én pedig a magam módján folytattam. Bocsi ezért a kitérőért, csak a honi csillagászat fejlődéséről olvastam egy nagyon jó könyvet nemrég, ami számos helyen megemlítette, hogy a paradigmaváltásokhoz egyszerűen csak generációváltás kellett a csillagászok között is. Na, ennyit megtettem ennek a mém-nek a túléléséért.

Nemrég egy másik projecttel kapcsolatban mégiscsak kiváncsiak lettek a többiek hogy hogyan csinálok egy release-t ebből az egészből. Elkezdtem hát elmutogatni a maven release plugin hogyan működik és azt hiszem volt pár dolog amin jogosan ráncolták a homlokukat.

Ennyi, amit csinálok: mvn release:clean release:prepare release:perform

Ezt csinálja helyetted a release plugin "release:prepare":
  1. Megnézi, hogy szinkronban vagy-e a verziókövetőddel
    Igen, itt például svn parancsot akar futtatni az operációs rendszereden keresztül. A $PATH-on rajta kell legyen. Itt kezd macerássá vállni a dolog a windows felhasználóknak.
  2. Lefuttatja a teszteket.
  3. A pom.xml-ben módosítja a verziót akármi-SNAPSHOT-ról simán akármi-re. Ezzel a SNAPSHOT dologgal is keresztben vannak páran nálunk, én nagyon bírom. Ezután bekommitolja a pom.xml-t, és egyből létre is hoz neki egy tag-et. Azaz létrejött egy tag, amihez nem is kell hozzányúlni, hogy a pom-ban a korrekt információk benne legyenek a verziójáról és persze ay SCM tag is a megfelelő információt tartalmazza.
  4. Átírja a pom.xml-t a legfrissebb fejlesztési verzióra és a scm url-t trunk-ra (illetve arra a branch-ra, ahol vagy) és bekommitolja. Szóval szépen elindított téged a következő verzió felé.
Majd a release:perform:
  1. Az éppen az "elöbb" betagelt verziót kicsekooutolja a target dir alá akárhova...
    A release:perform onnan tudja, hogy mi lett tagelve az elöbb, hogy hagy magának egy file-t a pom.xml mellett. Ezt a file-t a release:clean parancs törli le, ezért ezt is a biztonság kedvéért (azaz hogy ezen se kelljen gondolkodnom) a release parancs elejére oda szoktam írni, nehogy ott legyen az előző futásból és valami hülyeséget csináljak.
  2. Lefuttatja rajta a unit-teszteket, csak hogy biztos legyen a dolgában :-)
    Itt az a trükk, hogy igazából egy új mvn processzt indít el, azaz ha nincs az mvn parancs a $PATH-ban, akkor megint problémák következnek.
  3. Amikor kész, packagel, majd a distributionManagement tag információit felhasználva bedobja a csomagot a maven repo-ba.
    Ez nyilván csak egy sima deploy, nem release plugin spec a dolog, de el lehet tévedni. Például hogy ha scp-t használ az ember deploy-hoz, akkor kell neki egy scp. Windows felhasználóknak megint fejtörés, linuxon azért mindig ott van.
    A szervered nevére szükség van egy server bejegyzésre a settings.xml fileodban.
Kiválló lehetőségek elcsúszásra:
  1. első számú ok, hogy az SVN hozzáférésed nincs korrekten beállítva (nálam tipikusan a megbízhatatlan DNS szolgáltatás okozott bajokat régebben) és bár már módosította pom.xml-t, nem tudta bekommitolni. A dolog persze itt leáll, de nem csinálja ám vissza a változtatást. Ilyenkor futtatni kell egy svn revert-et a módosított file-okon.
  2. Ha nincs a setting.xml-ben megadva a maven repod eléréséhez a jelszó.
  3. És még egy pár dolog ami most nekem se jut eszembe :-D

Szóval a dolog legkevésbé sem golyóálló, de ha egyszer belőtted, akkor gyorsan kész lehetsz a release csomagolás unalmas feladatával, a kockázatokat és a mellékhatásokat is minimalizáltad. Ideális a release often release early gondolatvilágához. :)

Maven. Lustáknak, butáknak és nemtörődömöknek egyaránt tudom ajánlani.

A JUM-on megint nem voltam. Nagy megkönnyebbüléssel vettem tudomásul hogy nem került schedule-ra az a scrum kedvcsináló quickie, amit többen kértek tőlem, és inkáb a lemaradásaim csökkentésével foglalkoztam. Sajnos ki se látszom mostanában, például a fenti okokból.

Időközben pedig a scrum-ot kivégeztem, azaz alaposan átfaragtam a munkahelyi projectemen.

Ennyi a helyzet nálam. Boldog hétfőt, sziasztok!

2008. november 22., szombat

Csúnya de okos

Régebben maven artifactok kereséséhez a mvnrepository.com szolgáltatását használtam. Sajnos ez mostanában rémesen belassult (mainstream lett a maven?) és hébe-hóba egy-egy reklámcsíkkal is megdolgoztatja a firefox adblocker pluginját.
Viszont mostanában bukkantam rá a jaclaz.com oldalra. A kinézete alulmúlja a google designt, viszont egész értelmes dolgai vannak. Lehet osztályokra és packagekre is keresni, megmutatja a javadocot és a forráskódot is. Szóval mindenképpen biztatóbb mint a mvnrepository mostanában.
Egyébként ezt a kereső trükköt a legtöbb maven proxy is tudja, csak nekem nincs ilyen.

2008. november 18., kedd

Auto mate

Egy rossz élményemet leírnám ide a Continuous Integration témában, hogy erre esetleg vigyázzatok és próbáljátok meg elkerülni.

Abban az esetben, ha nálatok is minden csapat kitalálhatja magának hogy milyen build környezetet használ és esetleg bizonyos speciális dolgokat is beleépítetek (windowsos path-ok a build.xml-ben, exe fileok és más platform függő binárisok valahol a projectben, különleges classpath beállítások, környezeti változók, és a többi mocsokság), akkor a CI szervereteknél hamar felmerül az igény arra, hogy mindenkinek külön beállított build agentje legyen, amin az ő buildjei futnak. Egy kicsivel később már el is tulajdonolja egy-egy csapat ezeket a build agenteket és nem közös erőforrásként tekint rájuk, hanem inkább magántulajdon. Innentől kezdve egyes agentek majdnem teljesen kihasználatlanok lesznek, míg mások egész nap pörögnek, egyes csapatok csak másnap reggel kapják meg az eredményeket, mások azonnal.

Ez szerintem elég rossz irány és nagyon nehéz visszacsinálni ha egyszer megtörtént. Valamennyire le kell rendezni mindenkivel, hogy a buildje nem tartalmazhat speciális külső, hivatkozásokat és nem várhat el különleges beállításokat. Azaz ami kijött a verziókövetőből, annak úgy le is kell fordulnia akármilyen platformon. Persze megfelelő JDK és Ant és vagy Maven persze kell hozzá, de a megállapodás fontos. Talán még a legelején érdemes mindenkivel leüzletelni az egészet.

Szolgálati közlemény: Holnap elvileg JUM, legalábbis remélem mert már régen nem volt és ránk férne egy pár ötletcsere. Aki jó fej, az segíthetne egy 20-40 fős teremmel :-)

2008. november 1., szombat

Egy kis BDD

Újra itthon, több mint egy hétig mászkáltam mindenfelé és közben tanulgattam dolgokat. A legtöbbnek ezek közül a világon semmi köze nincs programozáshoz a nevükön kívül.

Viszont akadt kis idő arra is, hogy beszélgessek emberekkel az integration test megoldásaikról. Én igazából erre is tök egyszerű junit 4.4-et használok és nem fáj különösebben. Valami fény végre derengeni kezdett viszont arról is, hogy akik fitnesse-t hajtanak, azok miért szeretik. Korábban ugyanis sikerült rendesen félreértenem a dolog lényegét, csak annyit láttam belőle hogy valami furcsa wiki engine-t kell felstartolni érdekesen összehaxolt classpath-szal és majd az lefuttatja a teszteket. Ez a pontja még most is rém ellenszenves, de ez csak esztétikai kérdés.
A lényeg az lenne inkáb, hogy program írása nélkül, wikiből editálva építheted az integrációs tesztjeidet. Ez a wiki nem kell hogy egy központi szerver komponens legyen, felstartolhatod magadnál is, vagy ha nem komállod a felületét, írhatod egy sima text editorból is (ami talán kicsit barátságosabb is mint maga a wiki). Így nem azt írod le, hogy hogyan kell a kódodat letesztelni másik kóddal, hanem egy felhasználói történetet. (Azaz story, csak magyarítok újabban) A történet táblázatokból és kommentekből áll, a táblázatokat úgy nevezett fixture-k mondják meg, hogy hogyan kell őket felhasználni. Például az utolsó oszlop az elvárt eredmény, az többi a paraméterek, legegyszerűbb esetben. Azaz a wiki tartalma a fixture-kkel együt mondja meg, hogy hogyan kell a kódodat letesztelni :-)
A fitnesse-maven integráció a srácok szerint akkora gebasz, hogy jobb róla nem is beszélni. Úgyhogy valami kis custom ant+maven dolog van belőve.

Csak hogy ne legyen az, hogy akármit bekajálok amit vendéglátóim adnak, átfutottam pár könyvet agile testing témakörben és szétnéztem hogy mi a helyzet más megoldásokkal, és a diszkóblogos srác easyb projectjébe már sokadszor botlottam bele, sikeresen túl is jutott az ingerküszöbömön végre és kipróbáltam hogyan műxik. A meséket itt körülbelül groovy-ban írod, ami elég egyszerű szintaxis, még eclipse plugin is van hozzá (bár nem sokat ér szvsz). A webes wikis dolog a fitnesse-ben szerintem nem különösebben nagy érték, ha érték egyáltalán, ugyanis a nem technikai project tagok azt sem fogják tudni csinálni helyettünk. Úgyhogy a maven-integráció (működik) és az IDE support azért egyelőre mégis inkáb ebbe az irányba terel.

Ennyi van most, aztán kiderül később, hogy hogyan és merre tovább. Csinálok pár prototype projectet és megpróbálom beilleszteni más projecteimbe.

2008. április 9., szerda

Az eclipse útvesztőiben

Nézzük, mi az ábra a flex3 eclipse tákolással...
  • Nagyjából megy a builder, igaz nem inkrementális, de hát ez van egyelőre.
  • Pár ikon-dekoráció megtalálta a helyét. Én rajzoltam az ikonokat, mind az eggyet. Esztétikára nem adunk.
  • Van kettő wizard is, ebből csak az egyik működik :-D
Ami még minimálisan szükséges lenne a használhatósághoz:
  • Maven-hez flex3 mojo. Csak flex2-es van jelenleg
  • És persze rendesen gatyábarázni

2008. április 1., kedd

Eclipse WTP furcsaság

Mivel csak munkában használok ant-ot, eddig a maven megkímélt attól, hogy saját magamnak kelljen beállítani a WTP webalkalmazás projecteim másik projecten való függőségeivel járó .

  • Első lépés: webalkalmazás magában, egyszerűen csak megy, könnyed és gyors, mellesleg ez az emberek túlnyomó részének meg is felel
  • Második lépés: valami egyszerű project dependency, mondjuk egy Foo osztály statikus metódusát meghívni jsp-ből. Ez is megy, a Foo módosulásaira újradeployol az eclipse, frankó.
  • Harmadik lépés: legyenek a utility projectben a jar-ok. Atomkatasztrófa. Hol a classpath-szal lesz baj, hol a deploymenttel.

Elég kiábrándító :( Na mondjuk olyan is a fejlesztési processzünk, hogy az embernek lenne kedve elmenni messzire birkákat legeltetni. Ant, vár, ant mégegyszer máshol, megint vár, aztán tomi újraindít mert nem sikerült felnyalnia a friss jarokat, megint vár, aztán böngészővel vakarászik mert persze állapotfüggő az egész.
  • Alternatív harmadik lépés (gányolás szerintem), átmásolom a WEB-INF/lib könyvtába a utility project jar filejait. Ilyenkor megyeget a dolog az utolsó manuális lépés kivételével persze.

2008. március 27., csütörtök

Heti helyzet

  • Kijött a Sonar 1.2. Mostanában nagyon érdekel ez a szoftver és próbálom nyomni a munkahelyemen is. Sajnos maven-hez passzol igazán, ant-tal falábú, meg hát vannak neki egyéb korlátai is :( Viszont kezd nagyon jó cucc lenni, amikor a korlátok nem zavarnak.
  • Egy kis Drools prototipus projectett tervezgetek. A melóban a kódunk legnagyobb része az üzleti döntési folyamat lekódolva, mint mindenkinek. Majdnem mindenkinek. Persze így is le lenne kódolva, csak legalább nem a flow logikában :)
  • AMF data push-hoz kisérletezek valami általánisított megoldást, hogy körülbelül spring applicationContext-ben lehessen megmondani - interceptorral persze-, hogy melyik metódus hívása milyen csatornára küldjön update-t. Ezzel használhatjuk a primitív DAO osztályainkat tovább, amiket esetleg más projectekből vettünk át. Az adatok real-time replikálódnak DAO-t éppen használó a kliensekhez, annélkül hogy ehhez blazeds-specifikus kódot kellett volna belegyűrni a logikába. Na ennek is meglesznek a maga korlátai :)

2008. március 11., kedd

Flash kommunikációja egy backenddel AMF protokolon

Csináltam egy flex 2.x-es projectet maven-nel, erről a melóhelyemen tartok majd beszámolót, de itthon haxoltam, úgyhogy nyugodtan nézzen bele akit érdekel. Összetargézézve 5K :)

Ez van benne, csak hogy összefoglaljam:
  1. Spring inicializál egy POJO-t, ez a greetingDao. Tud egy pár köszönést, mint Hello World, ilyesmi...
  2. A spring contextet a BlazeDs egy adaptere segítségével bemutatjuk a BlazeDS konfigjának. Ez idáig csupa móka.
  3. Persze a web.xml-ben a BlazeDS egy szervlete be van regisztrálva, ez evidens...
  4. Na viszont ott a másik project, a bp-flex, itt van a Flex forrás. Ez egy RemoteObject-kent mutat az 1. pontban említett POJO-ra.
  5. Adtam távoli metódusonként 1 callback-et, hogy amikor visszajön az üzenet akkor meghívódjon és updatelődjön (imádom a hunglish nyelvet) a view.
  6. Ez pedig persze Flex databinding-gel van odabetonozva, ha bárki fennakadna azon, hogy mi a túró az a [Bindable]
Mivel nagyon nem vagyok kliens oldali hegesztőművész, erről az utolsó 3 dologról a következő napokban még kérdezgetem azokat akiket viszont annak tartok :)

Ha akad még időm valamikor kiteszem a hasonlóan vaskos funkcionalítású Web Services (XFire) kommunikációval működö prototípust is.

2008. március 5., szerda

Amitől continuous az integration

Egy continuous integration szerver -szerintem- ott válik el egy sima nightly build cucctól, hogy nem egyszerűen csak lebuildeli a cuccod, hanem a különböző modulokból amiket fejlesztessz, abból egy éppen aktuális verziót rak össze és azon futtajta a teszteket.
Két megvalósítás...
A teamcity-ben lehet manuálisan beállítni project függőségeket, a build végén az eredményt (a jart) beletolja az új projectbe és azzal is leteszteli azokat a projecteket amik ezen a projecten függenek. Ant projectek esetén ez egyszerűen csak nem lehet jobb. A maven projectek közti függőségeket TeamCity-vel még nem néztem meg, de manuálisan biztosan azt is be lehet állítani ugyanígy.
Na és akkor elmondanám a másik megoldást: Continuum + maven, a continuum a pom alapján felismeri a két project közti függőséget. Ez a rövidebb és egyszerűbb dolog :-) Ant esetén nem tudom mi van, de a saját fejlesztéseimben nem használok antot.

A TeamCity és a Continuum további lényeges különbsége, hogy a TeamCity webes felülete piszok jól néz ki, ezért a munkatársak jobban szeretik. A szép dolgokról könnyebb elhinni hogy hasznos.

2008. február 12., kedd

Hírek

A hét jó híre: Karenin tolja a JHacks híreit, szóval a régi közösségi események mellé mennyiségi és minőségi technológiai híreket is kaphatunk. Ez alkalomból lecseréltem a régi nagy böszme RSS ikont két kisebb XML ikonra, ott jönnek a hírek és a tartalomváltozások RSS-ben.

A nap első jó híre: a maven régi, sokak szerint elszúrt (szerintem is) XML formátuma, amiben csak tag-ek vannak de nincsenek attribútumok... Na ez most úgy tűnik lassan elmúlik a fejlesztő blogja szerint. A 2.0.9-től kezdve. Ez mondjuk nem holnap lesz, de remélem hamarosan.

A nap második jó híre: ráakadtam a sonar nevű alkalmazásra, ami egy érdekes frontend PMD, checkstyle, cobertura, surefire és stb elé. Nem ugyanaz mint a qalab, ez szerver komponens (viszont időbeli változásokat is figyel). Elösször is: semmit nem kell a project build leírásához hozzáadni, a maven pom.xml-jéből kitalál mindent amit ki kell. Mire nem jó, ugye, a deklaratív build... A statisztikákat egy tetszőleges adatbázisban gyűjti fel. Konkrétan az ami felgyűjti (egy maven plugin) az ennek az adatbázisnak a JDBC kliense. Én jobban szeretném az egészet, ha valami web service-n keresztül menne be az adat, és akkor csak egyet kellene mindenhol bekonfigolni: a sonar server URL-jét meg a firewallt se kellene bütykülnöm. Sebaj, végülis így is jó. CI szerverbe is simán be lehet lökdösni build definíciónak, és akkor van napra kész infónk arról hogy mi az ábra. QAlab done right :-)

2008. január 2., szerda

Pár hét TeamCity-használat tapasztalatai

Még a JavaPolis-on találkoztam a JetBreains embereivel, akik bemarketingelték nekem, hogy a TeamCity most már ingyen is használható 20 projectig és 20 felhasználóig. Ezzel érdemesnek tűnt egy alapos kipróbálásra.
  1. Megpróbáltam a régi és az új perverz verziókövetőt is hozzáilleszteni a munkahelyemen. A rémlassú kapcsolatunkkal a verziókövető rendszereinkkel már az elején gebasz volt, erre az Jira-ba nagyon gyorsan adtak egy workaround-féleséget, amivel a Perforce (az új perverziónk) elment, az MS-VSS valami rettenetes összevisszaságot teremtett a filerendszeren. Nem vagyok bizos benne, de úgy látszik file nem maradt épen. Úgy látszik ezt valami natív VSS kliens okozza, amit a TeamCity futtat.
    Ez túlélhető, ásatunk egy csinos kis gödröt a VSS-sel és megkérjük hogy térdeljen a szélére.
  2. Itthon persze a finom kis SVN fut, ezzel pillanatig nem volt probléma, ezt mondjuk el is várom :-)
  3. Maven multiprojecteim buildelése. Ezzel van egy olyan különbség a continuum-mal szemben, hogy nem dobja be az alprojecteimet külön projectként. A probléma akkor következik, amikor az előző project teszt hibái miatt az új projectek tesztjeit már le sem futtatja. Ez mondjuk logikus, de jobban szeretném ha mindent mindig lefuttatna, SNAPSHOT verziókban mindig vannak törött tesztek. Na erre beállítottam egy -Dmaven.test.failure.ignore kapcsolót a maven paraméterei közé. Ezzel megy. Persze kérdés hogy ez mennyire korrekt.
  4. Ezt még nem tudom, hogy miért, de a build agent újrastartolása után újra azonosítani kell a szerveren. Hmm, sebaj.
  5. Az egyik eclipse installációban a TeamCity plugin nem működget. Valószinűleg az a baja hogy utólag dobtam utánna a SVN plugint. Nyilván, munkában nem használunk SVN-t, az túl egyszerű lenne. Viszont a windózos teamcity tray icon az csodás dolog, egy ilyet szeretnék én gnome-hoz linuxra.
Ennyi, az érdekességekről...

2007. november 9., péntek

Wanted

A legjobb tréfa, amikor a saját munkaadóm legeslegfelső képvieslőjének levelét spam-nak minősíti a céges levelezőrendszer.

Na viszont...

Mostanában írtam egy rakás kis progit, amik amolyan apró állandóan futó scriptféleségek. Különböző szolgáltatásokkal (wikipedia, rss feedek, satöbbisatöbbi) kommunikálnak és ezek a külső szolgáltatások természetesen időnként magukba zuhannak. Ilyenkor persze mit tehetet az ember, lelövi a kis szkriptet, majd ha felszállt a remote rendszer, újra felstartolja. A többi persze megy tovább, the show must go on.
Na, erre a fajta dologra régen ott volt a loom, meg a többi avalonos szerver. Egyetlen VM, több alkalmazás benne és JMX-en keresztül lehetett bütykölni őket. Pontosabban ezek még most is itt vannak, csak azért meggongolandó hogy kellenek-e. Mert például bizonyos dolgokat nem tudnak, amik amolyan nice to have dolgok, például shared erőforrások, például JDBC DataSource, JMS, ilyenek.

Egyrészt fel kellene kutatni a létező megoldásokat:
Másrészt idefelé bóklászva kitaláltam egy saját megoldást is, persze utálok programozni, úgyhogy erre nem szivesen fanyalodnék, de egy saját megoldást könnyen össze lehetne hozni springgel, és POMStrap-pal, mivel persze maven-t használok úgy is minden fusi cuccomra. Tulajdonképpen pár classloaderrel kellene kiegészíteni, meg egy management felülettel, a többi elég evidens.

Ez kavarog most a fejemben. Meg egy mocskosul durva MSSQL-szívás erről a hétről, igazi enterprsie mese.

2007. augusztus 28., kedd

Kisérletezgetés opcionális függőségekkel

Hát célba ért a jdbc-wrapper mini-project. A tartalmáról már korábban írtam, nem is nagyon érdekes, a projekt struktúra viszont kicsit kisérleti jellegű volt, és ezt most szépen le is rajzoltam, hogy majd jól megmagyarázom mindenkinek hogy ilyet milyen elegánsan lehet maven alatt és nem kell kódot generálni, úgy mint a PostgreSQL JDBC projectben. Tessék:Szerintem ez elég vizuális, és a pom.xml-ekből is elég könnyen kiolvashatóak az összefüggések, ha valaki érti a profile-okat. Jó móka a maven profile-ok.