Mi határozza meg az összes osztály, hogy az alkalmazás a java

Nem kétséges, hogy bárki, aki az ő önéletrajzát jelzi tapasztalata fejlődő Java, életében egyszer, írt egy húr

Nyilatkozat a problémát

Felülírva a rendszer osztálybetöltése

Az első irány, ami eszébe jutott, amikor a probléma megoldása az volt, hogy kihasználják az expanziós osztály betöltése mechanizmus Java. Ebben a témában, meg van írva egy csomó cikket, köztük oroszul (link a cikk végén).
A lényege a mechanizmusa a következő:

Azonban ebben a szakaszban már az első ötlet, hogy megoldja ezt a problémát:

  1. Végre egy egyedi osztály betöltő, amely felváltja egy olyan rendszert, ha hívja a loadClass egyszerűen levelet az osztály nevét a fájlban, és küld egy kérést a teher egy osztály ezt boot loader. Szabályokra figyelemmel küldöttségének a fenti akkor lehetővé kell tennie, hogy az összes fogást letölthető saját osztályokat, akkor is, ha vannak betöltve más rendszerbetöltők;
  2. Legyen minden JVM, fut a gépen, hogy ezt a osztálybetöltője mint a rendszer.

Végrehajtásának második bekezdés megoldásához szükséges a következő problémákat:

  • hogy az osztály látható, hogy minden fut JVM. Tartalmazza osztályok minden eleme a kérelem osztályútvonal állítja kellemetlen, időigényes és nehézkes szempontjából a rendszer bővítését. Különösen, hogy van egy elegáns megoldás - tegye a rakodó osztály lib / ext JRE mappát. Az osztályok ebben a mappában nélkül, automatikusan beírja őket a classpath (mint említettük, azok tele vannak bővítmények rakodó JVM üzembe helyezés);
  • foglalt minden JVM rendszer tulajdon java.system.class.loader - a parancssorból, akkor lehet, hogy így: java -Djava.system.class.loader = imya.klassa.zagruzchika HelloWolrd
  • azonnal, hogy minden JVM futtatni a szükséges paramétert -Djava.system.class.loader. Mint kiderült, erre is van egy elegáns megoldás - meg kell használni egy speciális környezeti változót, amelynek értéke automatikusan hozzáadódik a paramétereket futni JVM. két változó, hogy felelős lehet ezt a funkciót találtak a keresés: JAVA_OPTS és JAVA_TOOL_OPTIONS. Azonban sem a cikkek nem ad egyértelmű választ arra a kérdésre, hogy mi a különbség a két változó között? A válasz erre a kérdésre, úgy döntöttek, hogy megtalálják empirikusan. A kísérlet során azt találtuk, hogy a jelen „mágikus” változó JAVA_TOOL_OPTIONS, melynek értéke automatikusan hozzáadódik a paramétereket futni kiváltott HotSpot JVM. A JAVA_OPTS - ez az eredménye egy hallgatólagos megállapodás a különböző fejlesztők Java alkalmazások. Ez a változó kifejezetten sokan használják scriptek (pl startup.sh/startup.bat futtatni Apache Tomcat), de nincs garancia arra, hogy ez lesz, hogy minden script fejlesztők változó.

Tehát, ez kész, a betöltő össze és helyezzük a lib / ext értéke a környezet JAVA_TOOL_OPTIONS állítva, indítsa el az alkalmazást, a munka, nyissa meg a log és látni ... egy szerény listát a tíz osztályt, beleértve a rendszer és számos harmadik fél osztályok. Ez volt akkor, és szükség volt felidézni a nem követelmény a szabály delegáló letöltése, valamint betekintést a forráskódját Apache Ant és Tomcat. Mint kiderült, a saját osztály rakodók használják ezeket az alkalmazásokat. Egyrészt, másrészt lehetővé tette számukra, hogy megtalálja a nagy teljesítményű funkciók. Azonban bármilyen okból, a fejlesztők ezen termékek döntött, hogy nem tartják be a szabályokat javasolt a felhatalmazás rendszerbetöltők és írt nekik nem mindig fordulnak a szülők letöltés előtt a következő osztályba. Ezért szinte semmit sem a boot loader osztályok betöltése Tomcat-ik-én és Ant.
Így ez a módszer nem az összes fogást a szükséges osztályok, különös tekintettel a különböző használt alkalmazás szerverek - aki tudja, hogyan reagáljon a küldöttség politikai fejlesztők letölthető az alkalmazás szerver az ügyfél.

Kísérlet a két számot. Alkalmazza műszerek osztályok.

  1. Írjon transzformátor osztályt, amely megvalósítja az eljárás ClassFileTransformer.transform. amely azonban nem vehet részt olyan átalakulás, és csak akkor éget a letöltött fájl nevét az osztály.
  2. Ismét meg kell győződnie arról, hogy ha írunk egy osztályt csatlakozni bármely Java alkalmazások futtatására.

A kiindulási transzformátor osztály-kódot az alábbi ábrán látható:

Szükséges tisztázni a mechanizmus segítségével osztály-transzformátorok. Ha csatlakozni egy osztály az alkalmazást, szükségünk van az úgynevezett premain osztály, azaz osztály tartalmazza az eljárás public static void premain (String paramString, hangszerelés paramInstrumentation). A módszer neve is magától értetődő, hogy ez előtt hivatkozni hivatkozva az eljárás fő. Ezen a ponton, tud-e csatlakozni az alkalmazás osztályok transzformátorok módszerrel addTransformer java.lang.instrument.Instrumentation felület. Így, az osztály és feletti osztály-transzformátor és premain-osztály. Ahhoz, hogy ez az osztály lehet használni, meg kell helyezni egy JAR fájlt, ami nyilvánvaló (META-INF / manifest.mf file) tartalmaz Premain-osztály paraméter alapján a teljes premain-osztály nevét, a mi esetünkben Premain-osztály: com.test .LoggingClassFileTransformer. Ezután meg kell adni a teljes elérési utat a fájlt egy paramétert, ha -javaagent JVM indításkor. Itt, hogy segítsen nekünk JAVA_TOOL_OPTIONS változó jön újra.
Így, az osztály meg van írva, összeállított, csomagolt együtt kiáltványt a JAR, a környezeti változó JAVA_TOOL_OPTIONS = -javaagent: „út a LoggingClassFileTransformer.jar” van megadva, az alkalmazás fut, jelentkezzen összegyűjtöttük, PROFIT!

következtetés

Tehát, milyen következtetéseket lehet tenni végét követően a projekt:

bibliográfia

Cikkek a osztálybetöltője Java:

Egyéb hasznos linkek: