{"id":430,"date":"2011-11-05T08:45:28","date_gmt":"2011-11-05T06:45:28","guid":{"rendered":"http:\/\/www.kristiansborg.dk\/bibliotek\/?page_id=430"},"modified":"2011-11-05T08:47:46","modified_gmt":"2011-11-05T06:47:46","slug":"kapitel-12-100-pure-java","status":"publish","type":"page","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/","title":{"rendered":"Kapitel 12 100% pure Java"},"content":{"rendered":"<p>Java er designet med det form\u00e5l at v\u00e6re platformsuafh\u00e6ngigt. Alligevel indeholder sproget masser af muligheder for at bryde denne uafh\u00e6ngighed. For eksempel kan man bruge JNI, der kalder programmer, som er kompileret til maskinkode.<\/p>\n<p>For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.<\/p>\n<div style=\"border: 1px solid red; color: red\">\n<b>Du l\u00e6ser en gammel bog<\/b><br \/>\nDen bog, du l\u00e6ser her, er fra 1998, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om de avancerede dele af Java, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0132354799)\"  target=\"_blank\">Core Java &#8211; Advanced Features<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" \/>\n<\/div>\n<p>Det er imidlertid ikke nok at love Sun, at ens program er platformsuafh\u00e6ngigt. Man skal igennem en l\u00e6ngere certificeringsproces. I dette kapitel vil denne proces blive beskrevet, ligesom forskellige punkter, der kr\u00e6ver s\u00e6rlig opm\u00e6rksomhed, vil blive gennemg\u00e5et.<\/p>\n<p>&nbsp;<\/p>\n<h1>Certificeringsprocessen<\/h1>\n<p>&nbsp;<\/p>\n<p>Certificeringsprocessen best\u00e5r overordnet af to faser:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Unders\u00f8gelsesfasen, der foretages af udvikleren.<\/li>\n<li>Kontrolfasen, der udf\u00f8res af et uafh\u00e6ngigt certificeringscenter.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>I unders\u00f8gelsesfasen gennemg\u00e5r udvikleren en r\u00e6kke tests for at se, om programmet opfylder kravene til 100% Pure Java. Er der punkter i programmet, som kan tyde p\u00e5 overtr\u00e6delse af bestemmelserne for 100% Pure Java, skal udvikleren enten \u00e6ndre disse punkter eller dokumentere, at de ikke giver problemer.<\/p>\n<p>&nbsp;<\/p>\n<p>Herefter skal programmet samt dokumentationen sendes til det uafh\u00e6ngige certificeringscenter. Her kan man \u2013 som dansker \u2013 enten v\u00e6lge det amerikanske KeyLabs eller det hollandske Telefication. Der findes ogs\u00e5 certificeringscentre i Japan og Kina.<\/p>\n<p>&nbsp;<\/p>\n<p>Prisen for en certificering er cirka 1.000 dollars, hvad enten produktet bliver godkendt eller ej.<\/p>\n<p>&nbsp;<\/p>\n<h2>Unders\u00f8gelsesfasen<\/h2>\n<p>&nbsp;<\/p>\n<p>I unders\u00f8gelsesfasen er der fem opgaver, der skal udf\u00f8res:<\/p>\n<p>&nbsp;<\/p>\n<ol>\n<li>Registrer ved et registreringscenter.<\/li>\n<li>Installer unders\u00f8gelsespakken.<\/li>\n<li>Foretag en statisk kontrol af programmet.<\/li>\n<li>Foretag en dynamisk kontrol af programmet.<\/li>\n<li>Forbered produktet til afsendelse.<\/li>\n<li>Send produktet til certificeringscentret.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Man kan registrere p\u00e5 certificeringscentrenes hjemmeside. Her skal man udover navn og adresse angive hvilken type produkt, man \u00f8nsker at f\u00e5 certificeret. Man kan v\u00e6lge mellem en applet, en applikation, en applikation med grafisk brugergr\u00e6nsflade, en klassesamling eller en JavaBean. Man skal ogs\u00e5 angive hvilken kategori, der bedst beskriver produktet. Man kan v\u00e6lge mellem f\u00f8lgende kategorier:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Regnskab<\/li>\n<li>Handel<\/li>\n<li>Kommunikation<\/li>\n<li>Grafik<\/li>\n<li>Database<\/li>\n<li>Undervisning<\/li>\n<li>Underholdning<\/li>\n<li>\u00d8konomi<\/li>\n<li>Internet<\/li>\n<li>Multimedie<\/li>\n<li>Netv\u00e6rk<\/li>\n<li>PDA-software<\/li>\n<li>Kalender mv.<\/li>\n<li>Programmeringsv\u00e6rkt\u00f8jer<\/li>\n<li>Systemsoftware<\/li>\n<li>Tekstbehandling og regneark<\/li>\n<li>Andet.<\/li>\n<\/ul>\n<p>N\u00e5r alle oplysninger er indtastet, kan prisen regnes ud. Ved Telefication koster certificering af et spil med en grafisk brugergr\u00e6nseflade 2.585 gylden svarende til cirka 8.700 danske kroner. N\u00e5r registreringen er indsendt og betalingen registreret, vil man modtage et brugernavn og et kodeord, der g\u00f8r det muligt at hente unders\u00f8gelsespakken.<\/p>\n<p>N\u00e5r man har hentet unders\u00f8gelsespakken, kan man installere den. Inkluderet i pakken er en r\u00e6kke eksempler, der viser, hvordan man s\u00e6tter systemet op til certificering. For at programmerne i unders\u00f8gelsespakken kan afvikles, skal man have JDK 1.1 installeret. Man beh\u00f8ver dog ikke kompilere sin egen applikation med JDK 1.1.<\/p>\n<p>Den statiske kontrol af ens applikation sker ved hj\u00e6lp af programmet Java Pure Check\u00a0(JPC). Dette program findes i en grafisk version og i en version, der kan afvikles fra kommandolinien. Inden JPS startes, skal man dog l\u00e6gge den jar-fil, der indeholder JPC, i sin class-path. Den grafiske version startes med kommandoen<\/p>\n<p>Java JavaPureCheck<\/p>\n<p>Herefter vises et sk\u00e6rmbillede som det i figur 12.1. Her kan man v\u00e6lge hvilke filer, der skal kontrolleres. Man kan ogs\u00e5 angive, hvilken JDK-version, programmet skal testes under, ligesom man kan angive hvilken fil, resultatet skal gemmes i.<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1201.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-432\" title=\"1201\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1201.png\" alt=\"\" width=\"540\" height=\"396\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1201.png 600w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1201-300x220.png 300w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/a><\/p>\n<p>Fig. 12.1 \u2013 Java Pure Check.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>I dette eksempel er det programmet ArrayPrint fra Java Native Interface-kapitlet, der bliver testet. Dette program indeholder naturligvis kald af native metoder og er derfor ikke 100% Pure. Som en naturlig f\u00f8lge, finder JPC fejl i programmet. Disse rapporteres \u2013 som det ses i figur 12.2 \u2013 i et sk\u00e6rmbillede, hvor man nederst har mulighed for at begrunde fejlen. Denne begrundelse vil automatisk blive indsat i rapportfilen, der skal sendes til certificeringscentret.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1202.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-431\" title=\"1202\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1202.png\" alt=\"\" width=\"543\" height=\"347\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1202.png 679w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1202-300x191.png 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r Java Pure Check finder en fejl, har man mulighed for at forklare den.<\/p>\n<p>&nbsp;<\/p>\n<p>Bruger man derimod programmet fra kommandolinien, skal man l\u00e6re f\u00f8lgende syntaks.<\/p>\n<p>&nbsp;<\/p>\n<p>Java JavaPureCheck [-d version] [-h] [-o output] input &#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>Parametren \u2013d angiver, hvilken version af JDK der anvendes. Dette kan enten v\u00e6re JDK102 eller JDK11. Hvis man angiver \u2013h, vil man f\u00e5 resultatet som HTML-dokumenter. \u2013o kan bruges til at angive et andet filnavn til rapporten end den vanlige results.jpc og results.ser.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Som input til programmet kan gives en blanding af klassefiler, jar-filer og biblioteker. Disse filer beh\u00f8ver ikke v\u00e6re inkluderet i class-path, da programmet aldrig bliver udf\u00f8rt \u2013 JPC l\u00e6ser dem blot som datafiler.<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r JPC bruges fra kommandolinien, har man ikke mulighed for at indtaste forklaringer p\u00e5 de forskellige fejl og advarsler. I stedet m\u00e5 man redigere rapportfilen og indtaste dem manuelt, f\u00f8r rapporten sendes til certificeringscentret. Rapportfilen kan se s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>###################### JavaPureCheck Report ##########################<\/p>\n<p>#<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 Generated on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : 1. august 1998 16:51:20 GMT+02:00<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 System Model Version\u00a0 : jdk11<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 JavaPureCheck Version : 3.15<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 Rule Base Version\u00a0\u00a0\u00a0\u00a0 : 1.92<\/p>\n<p>#<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 Summary:<\/p>\n<p>#<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 PURE: 0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WARNING: 0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ERROR: 1<\/p>\n<p>#<\/p>\n<p>#\u00a0\u00a0\u00a0\u00a0\u00a0 Final Result\u00a0\u00a0 :\u00a0 ERROR<\/p>\n<p>#<\/p>\n<p>######################################################################<\/p>\n<p>&nbsp;<\/p>\n<p>Class: ArrayPrint<\/p>\n<p>Error: method reference: java.lang.System.loadLibrary(java.lang.String)<\/p>\n<p>Note: Requires explanation; see Variance number 5<\/p>\n<p>Explanation: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;Explanation required&gt;<\/p>\n<p>Error: native method: ArrayPrint.print(int[])<\/p>\n<p>Note: Defines a native method<\/p>\n<p>Explanation: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;Explanation required&gt;<\/p>\n<p>Status: ERROR<\/p>\n<p>&nbsp;<\/p>\n<p>Final Result\u00a0\u00a0 :\u00a0 ERROR<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Udvikleren er ansvarlig for at forklare alle fejl og advarsler, der opst\u00e5r under afviklingen af JPC. Det g\u00e6lder ogs\u00e5, selvom problemerne findes i klasser, der er leveret af tredjepart.<\/p>\n<p>&nbsp;<\/p>\n<p>Senere i kapitlet vil de forskellige fejl og advarsler blive gennemg\u00e5et, ligesom mulige forklaringer p\u00e5 problemet vil blive foresl\u00e5et.<\/p>\n<p>&nbsp;<\/p>\n<p>Det n\u00e6ste skridt i unders\u00f8gelsesfasen er den dynamiske kontrol af programmet. Denne kontrol foretages ved hj\u00e6lp af testscripts. Form\u00e5let med afviklingen af testscriptene er at vise, at programmet ikke er afh\u00e6ngig af implementeringen af en specifik Java VM i et operativsystem eller browser. Programmet skal afvikles p\u00e5 mindst tre forskellige platforme, f\u00f8r det kan indsendes.<\/p>\n<p>&nbsp;<\/p>\n<p>Hvilke platforme, der godkendes, er op til certificeringscentrene. Nedenst\u00e5ende tabel viser hvilke platforme, der efter\u00e5ret 1998 anvendes til certificering af applikationer, klassesamlinger og JavaBeans.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"288\" valign=\"top\">Operativsystem<\/td>\n<td width=\"265\" valign=\"top\">Udvikler af Java VM<\/td>\n<td width=\"94\" valign=\"top\">JDK-version<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">Win95\/NT<\/td>\n<td width=\"265\" valign=\"top\">Sun Microsystems<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">Solaris<\/td>\n<td width=\"265\" valign=\"top\">Sun Microsystems<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">MacOS<\/td>\n<td width=\"265\" valign=\"top\">Apple Computer<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">OS\/2 Warp<\/td>\n<td width=\"265\" valign=\"top\">IBM<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">AIX<\/td>\n<td width=\"265\" valign=\"top\">IBM<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">Network Station<\/td>\n<td width=\"265\" valign=\"top\">IBM<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">HP UX<\/td>\n<td width=\"265\" valign=\"top\">Hewlett Packard<\/td>\n<td width=\"94\" valign=\"top\">1.0 og 1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"288\" valign=\"top\">JavaStation<\/td>\n<td width=\"265\" valign=\"top\">Sun Microsystems<\/td>\n<td width=\"94\" valign=\"top\">1.1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Hvis man \u00f8nsker at f\u00e5 en applet certificeret, er reglerne lidt anderledes. Appletten skal afvikles p\u00e5 tre forskellige operativsystemer, og minimum to forskellige browsere skal anvendes. Nedenst\u00e5ende tabel viser, hvilke browsere og operativsystemer, der kan anvendes.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"213\" valign=\"top\">Browser<\/td>\n<td width=\"161\" valign=\"top\">Operativsystem<\/td>\n<td width=\"180\" valign=\"top\">Udvikler<\/td>\n<td width=\"99\" valign=\"top\">JDK-version<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 3.x<\/td>\n<td width=\"161\" valign=\"top\">Win95\/NT<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 3.x<\/td>\n<td width=\"161\" valign=\"top\">Solaris<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 3.x<\/td>\n<td width=\"161\" valign=\"top\">MacOS<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 3.x<\/td>\n<td width=\"161\" valign=\"top\">OS\/2 Warp<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 3.x<\/td>\n<td width=\"161\" valign=\"top\">AIX<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 3.x<\/td>\n<td width=\"161\" valign=\"top\">HP UX<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Internet Explorer 3.x<\/td>\n<td width=\"161\" valign=\"top\">Win95\/NT<\/td>\n<td width=\"180\" valign=\"top\">Microsoft<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Internet Explorer 3.x<\/td>\n<td width=\"161\" valign=\"top\">MacOS<\/td>\n<td width=\"180\" valign=\"top\">Microsoft<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Internet Explorer 3.x<\/td>\n<td width=\"161\" valign=\"top\">MaxOS (IE for MRJ 1)<\/td>\n<td width=\"180\" valign=\"top\">Apple Computer<\/td>\n<td width=\"99\" valign=\"top\">1.0<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">HotJava Browser 1.1<\/td>\n<td width=\"161\" valign=\"top\">Win95\/NT<\/td>\n<td width=\"180\" valign=\"top\">Sun Microsystems<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">HotJava Browser 1.1<\/td>\n<td width=\"161\" valign=\"top\">Solaris<\/td>\n<td width=\"180\" valign=\"top\">Sun Microsystems<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">HotJava Views 1.0<\/td>\n<td width=\"161\" valign=\"top\">JavaStation<\/td>\n<td width=\"180\" valign=\"top\">Sun Microsystems<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Internet Explorer 3.x<\/td>\n<td width=\"161\" valign=\"top\">MacOS (IE for MRJ 2)<\/td>\n<td width=\"180\" valign=\"top\">Apple Computer<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Internet Explorer 4.x<\/td>\n<td width=\"161\" valign=\"top\">MaxOS (IE for MRJ 2)<\/td>\n<td width=\"180\" valign=\"top\">Apple Computer<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Internet Explorer 4.x<\/td>\n<td width=\"161\" valign=\"top\">Win 95\/NT<\/td>\n<td width=\"180\" valign=\"top\">Microsoft<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 4.x<\/td>\n<td width=\"161\" valign=\"top\">Win95\/NT<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 4.x<\/td>\n<td width=\"161\" valign=\"top\">Solaris<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 4.x<\/td>\n<td width=\"161\" valign=\"top\">MacOS<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 4.x<\/td>\n<td width=\"161\" valign=\"top\">OS\/2 Warp<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 4.x<\/td>\n<td width=\"161\" valign=\"top\">AIX<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<tr>\n<td width=\"213\" valign=\"top\">Navigator 4.x<\/td>\n<td width=\"161\" valign=\"top\">HP UX<\/td>\n<td width=\"180\" valign=\"top\">Netscape<\/td>\n<td width=\"99\" valign=\"top\">1.1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>De punkter, der skal omfattes af testscriptet, er de centrale punkter i programmet. Disse skal s\u00e5ledes identificeres og placeres p\u00e5 en funktionsliste\u00a0\u2013 <em>feature list<\/em>. N\u00e5r funktionslisten er skrevet, skal der skrives et testscript, der udf\u00f8rer punkterne p\u00e5 funktionslisten.<\/p>\n<p>&nbsp;<\/p>\n<p>Testscriptet kan enten v\u00e6re en liste over ting, der skal udf\u00f8res manuelt af den person, som tester programmet, eller et program, der tester applikationens funktioner. Hvis man skriver et automatisk program, skal dette naturligvis v\u00e6re platformsuah\u00e6ngigt. Det anbefales i \u00f8vrigt, at testprogrammer skrives i Java.<\/p>\n<p>&nbsp;<\/p>\n<p>Hver platform, man tester sit produkt p\u00e5, skal n\u00e6vnes i opf\u00f8rselsrapporten. Denne rapport beskriver, hvordan applikationen opf\u00f8rer sig p\u00e5 de forskellige platforme. Det er is\u00e6r vigtigt at beskrive punkter, hvor applikationen opf\u00f8rer sig forskelligt p\u00e5 forskellige platforme, og forklare, hvorfor dette ikke skal opfattes som et problem i forhold til certificeringen. Hvis man under sin test finder en fejl i den Java VM, man tester p\u00e5, skal man sende en fejlrapport til udvikleren af den p\u00e5g\u00e6ldende Java VM. Kopier af disse fejlrapporter skal inkluderes i opf\u00f8rselsrapporten.<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r alle udviklerens test er gennemf\u00f8rt succesfuldt, skal der oprettes en kontrolpakke, indeholdende produktet og resultatet af de forskellige test, samt en instruktion i, hvordan produktet skal benyttes.<\/p>\n<p>&nbsp;<\/p>\n<p>Denne instruktion skal skrives i en fil ved navn howto.txt. Denne fil skal indeholde f\u00f8lgende fire sektioner:<\/p>\n<p>&nbsp;<\/p>\n<ol>\n<li><em>Setup<\/em><br \/>\nI setup-sektionen anf\u00f8res produktets krav til hardware og software. Endvidere angives, hvilken Java-version, der skal testes under.<\/li>\n<li><em>Install<\/em><br \/>\nI installationssektionen beskrives de opgaver, der skal udf\u00f8res for at installere produktet. Hvis der er forskellige fremgangsm\u00e5der for forskellige platforme, skal dette ogs\u00e5 anf\u00f8res. Man skal ogs\u00e5 angive det n\u00f8jagtige indhold af variablerne path og classpath.<\/li>\n<li><em>Install Check<br \/>\n<\/em>I installationskontrolsektionen skrives en m\u00e5de, hvorp\u00e5 testeren kan afg\u00f8re om produktet er korrekt installeret.<\/li>\n<li><em>Product Documentation<br \/>\n<\/em>Denne sektion angiver placeringen af al dokumentation vedr\u00f8rende produktet. Dette kan v\u00e6re inkluderet i den pakke, der sendes til certificeringscentret, i elektronisk eller trykt form, eller det kan g\u00f8res tilg\u00e6ngeligt p\u00e5 Internet.<\/li>\n<li><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Pakken er nu klar til afsendelse. Det sker ved at informere certificeringscentret om, at man er klar til at indsende sit produkt til kontrol. Herefter kan man sende pakken til certificeringscentret \u2013 det g\u00f8res fra centrets hjemmeside.<\/p>\n<p>&nbsp;<\/p>\n<h2>Kontrolfasen<\/h2>\n<p>&nbsp;<\/p>\n<p>N\u00e5r produktet er indsendt til certificeringscentret, begynder kontrolfasen. Fra certificeringscentrets hjemmeside vil det \u2013 ved hj\u00e6lp af brugernavn og kodeord \u2013 v\u00e6re muligt at f\u00f8lge produktets forl\u00f8b gennem kontrolfasen. Normalt vil et program komme gennem kontrolfasen p\u00e5 fem hverdage.<\/p>\n<p>&nbsp;<\/p>\n<p>I kontrolfasen gennemg\u00e5r produktet f\u00f8lgende punkter:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Unders\u00f8gelse af kontrolpakken<\/li>\n<li>Statisk kontrol af produktet<\/li>\n<li>Dynamisk kontrol af produktet<\/li>\n<li>Afg\u00f8relse af, om produktet dumper eller best\u00e5r.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>S\u00e5 snart certificeringscentret modtager kontrolpakken, bliver den unders\u00f8gt. Hvis den ikke indeholder de elementer, der er beskrevet i forrige afsnit, vil udvikleren blive informeret via e-mail. Er der mangler i pakken, skal den genindsendes. Normalt koster det ikke ekstra at genindsende en pakke. Man skal dog v\u00e6re opm\u00e6rksom p\u00e5, at kontrollen ikke vil begynde, f\u00f8r en komplet pakke er modtaget.<\/p>\n<p>&nbsp;<\/p>\n<p>Certificeringscentret vil udf\u00f8re den statiske kontrol ved hj\u00e6lp af Java Pure Check-programmet. Herefter kontrolleres det, at alle fejl og advarsler, der opst\u00e5r, er begrundet af udviklerne.<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r den statiske kontrol er gennemf\u00f8rt, vil programmet blive testet p\u00e5 flere forskellige platforme i henhold til testscriptene. Det er ikke us\u00e6dvanligt, at certificeringscentret har sp\u00f8rgsm\u00e5l om scriptet eller installationen af produktet \u2013 disse sp\u00f8rgsm\u00e5l vil blive stillet via e-mail.<\/p>\n<p>Certificeringscentret afs\u00e6tter otte timer til at gennemg\u00e5 den dynamiske kontrol. Hvis det ikke er muligt at gennemg\u00e5 kontrollen indenfor det afsatte tidsrum p\u00e5 grund af fejl og mangler, der skal udbedres, stoppes certificeringsprocessen, og udvikleren kontaktes for at aftale ny betaling.<\/p>\n<p>Hvis testscriptet ikke kan gennemf\u00f8res, vil programmet ikke blive certificeret, f\u00f8r problemet er l\u00f8st. Problemer med at fuldf\u00f8re afviklingen af et testscript kan opdeles i tre kategorier:<\/p>\n<ul>\n<li>En fejl i programmet<br \/>\nHvis der er en fejl i programmet, skal denne udbedres, og programmet skal genindsendes.<\/li>\n<li>En fejl i Java-platformen<br \/>\nHvis problemet skyldes en fejl i den underliggende Java-platform, skal der indsendes en n\u00f8jagtig fejlbeskrivelse til udvikleren af den p\u00e5g\u00e6ldende Java-platform. En kopi sendes til certificeringsinstituttet.<\/li>\n<li>En fejl et uafklaret sted<br \/>\nHvis det ikke kan afg\u00f8res, om en fejl ligger i programmet eller Java-platformen, vil den blive behandlet som en fejl i Java-platformen. Det vil sige, at man skal indsende en fejlrapport til platformsudvikleren.<\/li>\n<li><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r programmet har gennemg\u00e5et den statiske og dynamiske kontrol, vil udvikleren modtage en godkendelsesrapport. Sun vil blive informeret om, at produktet er blevet certificeret, og man vil modtage sin 100% Pure Java licens. Af denne fremg\u00e5r det, hvordan man m\u00e5 benytte 100% Pure Java-logoet.<\/p>\n<p>&nbsp;<br \/>\n<script type=\"text\/javascript\">\nvar uri = 'http:\/\/impdk.tradedoubler.com\/imp?type(js)g(19172330)a(2029446)' + new String (Math.random()).substring (2, 11);\ndocument.write('<sc'+'ript type=\"text\/javascript\" src=\"'+uri+'\" charset=\"\"><\/sc'+'ript>');\n<\/script><\/p>\n<h1>Udvikling af et 100% Pure Java-produkt<\/h1>\n<p>&nbsp;<\/p>\n<p>Indtil videre har dette kapitel koncentreret sig om, hvordan man kontrollerer, om ens produkt lever op til de krav, der stilles til et 100% Pure Java-produkt. Det er imidlertid lettere at lave programmet rigtigt f\u00f8rste gang i stedet for at skulle implementere \u00e6ndringerne, efterh\u00e5nden som fejlene opdages. Derfor vil resten af kapitlet koncentrere sig om, hvilke r\u00e5d og retningslinier man b\u00f8r f\u00f8lge, n\u00e5r man udvikler et 100% Pure Java-program.<\/p>\n<p>Form\u00e5let med 100% Pure Java er at certificere programmer, der er platformsuafh\u00e6ngige (portable). Mange vil definere et program som platformsuafh\u00e6ngigt, hvis det producerer det samme resultat p\u00e5 alle platforme. Som nedenst\u00e5ende klasse viser, er denne definition ikke helt korrekt.<\/p>\n<p>&nbsp;<\/p>\n<p>public class VisOS<\/p>\n<p>{<\/p>\n<p>public static final void main (String args[])<\/p>\n<p>{<\/p>\n<p>try<\/p>\n<p>{<\/p>\n<p>System.out.println (System.getProperty (&#8220;os.name&#8221;));<\/p>\n<p>}<\/p>\n<p>catch (RuntimeException re)<\/p>\n<p>{<\/p>\n<p>re.printStackTrace();<\/p>\n<p>System.exit(1);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>De fleste vil nok kunne enes om, at dette program er platformsuafh\u00e6ngigt, selvom det giver et forskelligt resultat p\u00e5 forskellige platforme. Nedenst\u00e5ende program minder s\u00e6rdeles meget om klassen VisOS, men som det ses, vil dette program ikke afvikles p\u00e5 alle platforme.<\/p>\n<p>public class CheckOS<\/p>\n<p>{<\/p>\n<p>public static final void main (String args[])<\/p>\n<p>{<\/p>\n<p>try<\/p>\n<p>{<\/p>\n<p>String os = System.getProperty(&#8220;os.name&#8221;);<\/p>\n<p>if (os.equals (&#8220;Windows 95&#8221;))<\/p>\n<p>{<\/p>\n<p>throw new RuntimeException();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>catch (RuntimeException re)<\/p>\n<p>{<\/p>\n<p>re.printStackTrace();<\/p>\n<p>System.exit(1);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Forskellen p\u00e5 de to programmer er ikke den m\u00e5de, de bruger Java-platformen p\u00e5. Det er den funktionalitet, de implementerer.<\/p>\n<p>&nbsp;<\/p>\n<p>Selvom mange mener, at pure og portabelt er det samme, er det ikke tilf\u00e6ldet. Hvor man ikke uden videre kan se, om et program er portabelt, kan man kontrollere om det er pure. Programmer, der er pure, er sandsynligvis ogs\u00e5 portable \u2013 hvis de ikke er det, skyldes det en bevidst programmering af platformsafh\u00e6ngighed.<\/p>\n<h2>Regler for 100% Pure Java-programmer<\/h2>\n<p>For at f\u00e5 et program, der er 100% Pure Java, er der fire\u00a0 regler, man skal overholde:<\/p>\n<ul>\n<li>Brug ikke native metoder.<\/li>\n<li>Brug kun Java\u2019s API.<\/li>\n<li>Brug ikke platformsafh\u00e6ngige konstanter.<\/li>\n<li>F\u00f8lg retningslinierne for anvendelsen af API\u2019et.<\/li>\n<\/ul>\n<p>I dette afsnit vil det blive gennemg\u00e5et, hvordan man overholder disse regler.<\/p>\n<p>Den f\u00f8rste regel siger, at man ikke m\u00e5 anvende native metoder. Dette skyldes, at native metoder er kompileret til maskinkode, der er specifik for de forskellige operativsystemer. Da native metoder ogs\u00e5 er skrevet i et andet programmeringssprog end Java, mister man mange af de fordele, Java giver \u2013 eksempelvis sikkerhed og garbage collection.<\/p>\n<p>&nbsp;<\/p>\n<p>Reglen om ingen brug af native metoder betyder ogs\u00e5, at det ikke er alle metoder i klassen java.lang.Runtime, der m\u00e5 anvendes. Mange af disse metoder, giver adgang til hardware, og selvom metoderne ofte er anvendelige, er de ganske afgjort ikke portable. Metoden Runtime.exec er et s\u00e6rtilf\u00e6lde, idet den gerne m\u00e5 bruges under visse omst\u00e6ndigheder. Der stilles f\u00f8lgende krav til anvendelsen af Runtime.exec:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Udf\u00f8rslen af metoden skal skyldes en handling foretaget af brugeren. Brugeren skal s\u00e5ledes v\u00e6re klar over, at det er et separat program, der bliver udf\u00f8rt.<\/li>\n<li>Brugeren skal kunne v\u00e6lge, hvilket program der startes. Dette kan enten ske under installationen, ved konfigurering eller lige f\u00f8r programmet udf\u00f8res.<\/li>\n<li>Alle fejl, der opst\u00e5r ved udf\u00f8rsel af Runtime.exec, skal h\u00e5ndteres. Dette g\u00e6lder i s\u00e6rlig grad den fejl, der opst\u00e5r, hvis programmet ikke findes.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Overholder man disse regler, er det tilladt at afvikle andre programmer. Eksempler p\u00e5 lovlig adf\u00e6rd kan v\u00e6re:<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Start af Java-compileren, hvis brugeren selv kan v\u00e6lge navnet p\u00e5 compileren.<\/li>\n<li>Udf\u00f8rsel af en kommando brugeren indtaster \u2013 en shell eller en dos-prompt.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Den eneste undtagelse for reglen om ingen anvendelse af native metoder er brug af alternative implementeringer af standard interfaces. Mange af metoderne i Java API\u2019et er native, men da disse skal findes p\u00e5 alle platforme, er det tilladt at bruge disse.<\/p>\n<p>&nbsp;<\/p>\n<p>Reglen om, at man kun m\u00e5 bruge Javas API, bunder i, at programmer skal v\u00e6re komplette, f\u00f8r de kan certificeres som 100% Pure Java. Det vil sige, at de ikke m\u00e5 indeholde referencer til eksterne biblioteker eller interfaces, som ikke er en del af Java-standarden. Det er naturligvis tilladt at bruge komponenter fra tredjepart, n\u00e5r blot disse leveres med programmet.<\/p>\n<p>&nbsp;<\/p>\n<p>Reglen omfatter ogs\u00e5, at man ikke m\u00e5 bruge udokumenterede funktioner i Java API\u2019et. Mange af klasserne i API\u2019et g\u00f8r selv brug af disse funktioner, men det er ikke tilladt for andre programmer at g\u00f8re det. Det skyldes, at Sun forbeholder sig ret til at \u00e6ndre i de udokumenterede funktioner. Det er herefter op til de, der har licenseret Java, at s\u00f8rge for, at de dokumenterede dele af API\u2019et stadigv\u00e6k fungerer. Grunden til, at funktionerne ikke er dokumenterede, er netop, at de ikke er beregnet til at blive brugt af applikationsprogramm\u00f8ren.<\/p>\n<p>&nbsp;<\/p>\n<p>Hele pakken java.awt.peer er omfattet af denne regel. De interfaces og klasser, der befinder sig i denne pakke, er dokumenteret som \u201danvendes af AWT-implement\u00f8rer\u201d. Et platformsuafh\u00e6ngigt program vil g\u00f8re brug af AWT fremfor at implementere det.<\/p>\n<p>&nbsp;<\/p>\n<p>Den tredje regel siger, at der ikke m\u00e5 anvendes platformsafh\u00e6ngige konstanter. Dette udtryk er lidt kryptisk, men det d\u00e6kker blot over, at man ikke m\u00e5 bruge konstanter, der ikke er konstante p\u00e5 alle platforme. Eksempelvis bruger Windows 95 og Unix ikke det samme tegn til at adskille elementer i en sti, og der kan ogs\u00e5 v\u00e6re forskel p\u00e5, hvilken tegnkombination som bruges til at angive linieskift.<\/p>\n<p>&nbsp;<\/p>\n<p>Den sidste regel siger, at man skal overholde de retningslinier, der g\u00e6lder for brug af API\u2019et. G\u00f8r man ikke dette, er det muligt at skrive programmer, der er syntaktisk korrekte, men som alligevel ikke vil v\u00e6re portable.<\/p>\n<p>&nbsp;<\/p>\n<p>Et eksempel p\u00e5 dette kan v\u00e6re en klasse, der overskriver java.lang.Object\u2019s equals-metode. Denne klasse skal ogs\u00e5 redefinere metoden hashCode for at opretholde den invariant, at objekter, der er ens, har den samme hashkode.<\/p>\n<p>&nbsp;<\/p>\n<p>Det er sv\u00e6rt at kontrollere, om reglen bliver overholdt, og det er ikke sikkert, at alle brud p\u00e5 den vil blive opdaget af certificeringscentret.<\/p>\n<p>&nbsp;<\/p>\n<h1>Almindelige fejl<\/h1>\n<p>&nbsp;<\/p>\n<p>Reglerne for et 100% Pure Java-program er ret abstrakte. Det kan v\u00e6re sv\u00e6rt at sige, om en specifik fremgangsm\u00e5de er tilladt eller ej. I dette afsnit vil forskellige almindelige fejl blive gennemg\u00e5et, ligesom det vil blive forklaret, hvordan man kan opn\u00e5 den samme funktionalitet p\u00e5 en pure m\u00e5de.<\/p>\n<h2>Tr\u00e5de<\/h2>\n<p>Tr\u00e5de h\u00e5ndteres forskelligt p\u00e5 forskellige platforme. Der er ingen garanti for, at den samme scheduleringsmetode anvendes i alle implementeringer af Java. Derfor m\u00e5 man ikke i sit program opstille forventninger om, hvor meget processortid de forskellige tr\u00e5de tildeles. Hvis man bruger denne fremgangsm\u00e5de til at sikre, at der ikke er flere tr\u00e5de, som tilg\u00e5r det samme objekt samtidigt, er ens program ikke portabelt.<\/p>\n<p>&nbsp;<\/p>\n<p>Dette problem er et kompliceret problem, og det ikke nemt at se, om det eksisterer i ens kode. Det er heller ikke nemt at l\u00f8se problemet. En drastisk l\u00f8sning er at markere alle metoder som synkroniserede (synchronized). P\u00e5 den m\u00e5de kan man fange en del af synkroniseringsproblemerne, men ikke dem alle. Den eneste universelle l\u00f8sning er at programmere efter nogle sikre retningslinier. Disse er forklaret i adskillige l\u00e6reb\u00f8ger om parallel programmering.<\/p>\n<p>&nbsp;<\/p>\n<h2>Native metoder<\/h2>\n<p>&nbsp;<\/p>\n<p>I visse situationer kan det synes n\u00f8dvendigt at bruge native metoder. Dette kan enten v\u00e6re for at give adgang til specielle systemressourcer eller for at optimere en tung del af et program.<\/p>\n<p>&nbsp;<\/p>\n<p>Der findes to l\u00f8sninger p\u00e5 dette problem:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Definer en simpel protokol, der giver adgang til den \u00f8nskede ressource, og skriv et 100% Pure Java-program som en klient af den protokol.<\/li>\n<li>Omskriv den native metode i Java.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>En tredje l\u00f8sning kunne v\u00e6re at begr\u00e6nse alle native metoder til en enkelt klasse, og s\u00e5 levere en implementering af denne klasse til alle platforme, der underst\u00f8tter Java. Denne l\u00f8sning er imidlertid ikke gyldig, da antallet af platforme, der unders\u00f8tter Java, stiger konstant. Derudover skal man t\u00e6nke p\u00e5, at det ikke er alle platforme, der kan afvikle kompileret kode. Det g\u00e6lder eksempelvis JavaStation.<\/p>\n<p>&nbsp;<\/p>\n<h2>Sk\u00e6rmops\u00e6tning<\/h2>\n<p>Som n\u00e6vnt tidligere bruger forskellige platforme forskellige tegn til at angive et linieskift. Det er ogs\u00e5 forskelligt, hvilke opl\u00f8sninger og systemfarver der kan bruges p\u00e5 de forskellige platforme.<\/p>\n<p>Java indeholder forskellige metoder til at f\u00e5 informationer om det system, programmet afvikles p\u00e5. Hvis man anvender disse, beh\u00f8ver man ikke skrive informationerne direkte i programmet.<\/p>\n<p>Hvis man vil have at vide, hvilke tegn der bruges som linieskift, kan man kalde System.getProperty (&#8220;line.seperator&#8221;). Vil man have st\u00f8rrelsen af sk\u00e6rmen, kan man bruge de getSize-metoder, der findes i AWT, mens systemfarverne kan findes i java.awt.SystemColor. Generelt kan det anbefales at benytte layout-managere i stedet for at angive st\u00f8rrelsen af de forskellige komponenter i programmet. Man skal ogs\u00e5 v\u00e6re opm\u00e6rksom p\u00e5, at de forskellige komponenter i AWT og Swing kan have forskellige st\u00f8rrelse p\u00e5 forskellige platforme.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Reflections<\/h2>\n<p>&nbsp;<\/p>\n<p>Reflections er en s\u00e6rdeles st\u00e6rk facilitet \u2013 desv\u00e6rre g\u00f8r den det ogs\u00e5 sv\u00e6rere at forudsige, hvordan programmer vil opf\u00f8re sig. Man kan eksempelvis kalde Method.invoke p\u00e5 enhver metode \u2013 ogs\u00e5 metoder der g\u00f8r, at programmet ikke er 100% Pure Java. Reflections skal derfor bruges med stor forsigtighed.<\/p>\n<p>&nbsp;<\/p>\n<h2>System.exit<\/h2>\n<p>&nbsp;<\/p>\n<p>Metoden System.exit medf\u00f8rer, at programmet afsluttes omg\u00e5ende. Dette medf\u00f8rer, at alle tr\u00e5de i den virtuelle maskine bliver stoppet. Dette kan medf\u00f8re, at vinduer bliver lukket, uden at brugeren f\u00e5r en mulighed for at gemme indholdet af dem.<\/p>\n<p>Generelt b\u00f8r man ikke benytte System.exit til at stoppe programmet. Metoden er forbeholdt de tilf\u00e6lde, hvor en fejl g\u00f8r, at programmet simpelthen ikke kan forts\u00e6tte. System.exit\u00a0kan ogs\u00e5 anvendes, hvis programmet skal anvendes i et script eller en batchfil, hvor programmets fejlkode er vigtig.<\/p>\n<h2>Filnavne<\/h2>\n<p>Hvis man angiver en komplet sti til et filnavn \u2013 for eksempel data\\data.dat \u2013 g\u00f8r man programmet uportabelt. Det er nemlig ikke alle platforme, der bruger det samme tegn til at adskille elementer i en sti.<\/p>\n<p>Der findes generelt tre portable m\u00e5der at oprette et filnavn p\u00e5:<\/p>\n<ul>\n<li>Brug File (File, String) til at opbygge stien.<\/li>\n<li>Brug system properties til at finde ud af hvilke tegn, der bruges til at adskille stier og filnavne. Det g\u00f8res ved hj\u00e6lp af System.getProperties (&#8220;file.separator&#8221;) og SystemGetProperties (&#8220;path.separator&#8221;).<\/li>\n<li>Brug en dialogboks til at bede brugeren angive filnavnet.<\/li>\n<\/ul>\n<h2>JDBC<\/h2>\n<p>Det JDBC-interface, der ligger i java.sql-pakken, giver fleksibilitet i indl\u00e6sningen af JDBC-driverne. Denne fleksibilitet g\u00f8r det muligt at skifte mellem flere forskellige JDBC-drivere uden at skulle \u00e6ndre programmet.<\/p>\n<p>Denne fleksibilitet gives af klassen DriverManager. Der findes to m\u00e5der at fort\u00e6lle denne klasse, hvilke drivere der er tilg\u00e6ngelige.<\/p>\n<ul>\n<li>De kan n\u00e6vnes i jdbc.drivers-property\u2019en.<\/li>\n<li>De kan indl\u00e6ses ved hj\u00e6lp af metoden java.lang.Class.forName.<\/li>\n<\/ul>\n<p>Dette kan medf\u00f8re et portabilitetsproblem, da JDBC-driverne ikke n\u00f8dvendigvis er liges\u00e5 portable som resten af programmet. Hvis man angiver et specifikt navn p\u00e5 en JDBC-driver i sin kode, er programmet ikke mere portabelt end denne driver.<\/p>\n<p>&nbsp;<\/p>\n<p>L\u00f8sningen p\u00e5 dette problem er at give brugeren mulighed for at konfigurere, hvilken JDBC-driver der skal anvendes. Det kan man g\u00f8re ved at l\u00e6se<\/p>\n<p>&nbsp;<\/p>\n<p>fra properties eller ved at lade brugeren selv angive det filnavn, der bruges i Class.forName-metoden. Man kan ogs\u00e5 lade udv\u00e6lgelsen af driveren v\u00e6re op til DriverManager-klassen. Hvis man g\u00f8r det, skal man v\u00e6re opm\u00e6rksom p\u00e5 f\u00f8lgende:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Drivere fors\u00f8ges indl\u00e6st i den r\u00e6kkef\u00f8lge, de er blevet registreret. Det vil sige, at tidlige drivere vil have prioritet over drivere, der er registreret senest. De drivere, der er angivet i jdbc.drivers, vil have den h\u00f8jeste prioritet.<\/li>\n<li>En driver, der inkluderer native kode, vil ikke kunne indl\u00e6ses p\u00e5 andre platforme end den, den blev skrevet for. Derfor m\u00e5 programmet h\u00e5ndtere muligheden for en ClassNotFoundException.<\/li>\n<li>En driver med native kode m\u00e5 ikke registrere sig i DriverManager, f\u00f8r den er sikker p\u00e5, at den er indl\u00e6st.<\/li>\n<li>En driver med native kode er ikke omfattet af Javas sikkerhedsmodel og kan derfor udg\u00f8re en sikkerhedsrisiko.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Kommandolinie<\/h2>\n<p>&nbsp;<\/p>\n<p>Programmer, der kun bruger kommandolinien til at interagere med brugeren, er ikke portable. Det er nemlig ikke alle platforme, der har en kommandolinie. Hvis man kun bruger System.in, System.out eller System.err, b\u00f8r man overveje at lave en grafisk brugergr\u00e6nseflade \u2013 i det mindste som et alternativ.<\/p>\n<p>&nbsp;<\/p>\n<p>Et andet problem, der er relateret til kommandolinien, er, hvordan parametre skal fortolkes. Den mest portable fremgangsm\u00e5de er at lade v\u00e6re med at anvende kommandolinieparametre, men det er ikke en mulighed, hvis programmet skal bruges fra et script eller en batchfil. Hvis man er n\u00f8dt til at lade sit program acceptere parametre, b\u00f8r man som minimum underst\u00f8tte POSIX-standarden, hvor parametre indledes med en bindestreg (dash). Det er meget almindeligt, at b\u00e5de bindestreg og skr\u00e5streg (slash) kan anvendes til at angive parametre. Som alternativ b\u00f8r man inkludere en grafisk brugergr\u00e6nseflade eller muligheden for at indl\u00e6se parametre fra en property-fil.<\/p>\n<p>&nbsp;<\/p>\n<h2>Event-h\u00e5ndtering<\/h2>\n<p>&nbsp;<\/p>\n<p>Eventh\u00e5ndteringen blev \u00e6ndret fra JDK version 1.0.2 til version 1.1. Programmer, der g\u00f8r brug af eventh\u00e5ndteringsmekanismen, kan afvikles p\u00e5 en version 1.1-platform, men programmer, der bruger en kombination af de to fremgangsm\u00e5der, er ikke sikre p\u00e5 at kunne afvikles. Selvom programmet ser ud til at virke p\u00e5 \u00e9n platform, er der ingen garanti for, at den virker p\u00e5 en anden.<\/p>\n<p>&nbsp;<\/p>\n<p>L\u00f8sningen p\u00e5 dette problem er naturligvis at v\u00e6lge, hvilken model man vil bruge. Hvis man konverterer et program fra version 1.0.2 til version 1.1, skal man g\u00f8re dette p\u00e5 en gang \u2013 man skal ikke konvertere sm\u00e5 dele af programmet.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Ukurante\u00a0 metoder<\/h2>\n<p>&nbsp;<\/p>\n<p>Dokumentationen af Javas API angiver, at nogle metoder ikke l\u00e6ngere er g\u00e6ngse \u2013 de er blevet markeret som <em>deprecated<\/em>. Det vil sige, at metoderne stadig underst\u00f8ttes, men vil blive fjernet p\u00e5 et senere tidspunkt. Hvis man bruger en for\u00e6ldet metode, f\u00e5r man det at vide, n\u00e5r man kompilerer sit program. Det er generelt et godt r\u00e5d at \u00e6ndre sit program i s\u00e5 fald, da der sikkert er en grund til, at metoden er blevet markeret som ukurant.<\/p>\n<p>&nbsp;<\/p>\n<p>Man kan f\u00e5 yderligere oplysninger om for\u00e6ldede metoder ved at tilf\u00f8je parametren \u2013deprecation til kaldet af javac. Der gives ogs\u00e5 oplysninger om for\u00e6ldede metoder i specifikationerne af Java API\u2019et.<\/p>\n<h2>Installation<\/h2>\n<p>Der kan opst\u00e5 mange problemer i forbindelse med installation af produktet. Nogle platforme har en begr\u00e6nsning i l\u00e6ngden af filnavne, og det er ofte begr\u00e6nset, hvilke tegn der m\u00e5 anvendes i filnavne. Dette kan give problemer, da virtuelle Java-maskiner g\u00f8r brug af en simpel fortolkning fra klassenavn til filnavn.<\/p>\n<p>De restriktioner, der kan give problemer, er:<\/p>\n<ul>\n<li>Begr\u00e6nsning af l\u00e6ngden af filnavne. Dette er is\u00e6r et problem med indre klasser, der gives forholdsvis lange filnavne.<\/li>\n<li>Store og sm\u00e5 bogstaver. Nogle platforme (eksempelvis Windows) behandler store og sm\u00e5 bogstaver ens. Hvis man har to klasser eller pakker, eller en klasse og en pakke, der har det samme navn blot med forskellig blanding af store og sm\u00e5 bogstaver, vil programmet ikke kunne afvikles p\u00e5 disse platforme.<\/li>\n<li>Manglende underst\u00f8ttelse af Unicode. Klassers navne kan indholde Unicode-tegn, der ikke kan bruges som filnavne p\u00e5 alle platforme.<\/li>\n<li>Specielle filnavne. Nogle platforme giver specielle filnavne en speciel betydning. Det g\u00e6lder for eksempel navne som LPT og con. Disse navne kan ikke bruges som navne p\u00e5 pakker eller klasser p\u00e5 disse platforme.<\/li>\n<\/ul>\n<p>L\u00f8sningen p\u00e5 dette problem er at l\u00e6gge alle filerne i en JAR-pakke. Det vil l\u00f8se problemerne med begr\u00e6nsninger i l\u00e6ngden p\u00e5 filnavne og ogs\u00e5 problemerne med store og sm\u00e5 bogstaver. JAR er implementeret i Java fra og med version 1.1. Hvis man bruger JDK version 1.0, er zip-filer et godt alternativ.<\/p>\n<h2>Internetadresser<\/h2>\n<p>&nbsp;<\/p>\n<p>Man skal v\u00e6re opm\u00e6rksom p\u00e5, at den streng, der returneres af java.net.InetAddress.getHostName, er platformsafh\u00e6ngig. P\u00e5 nogle platforme returneres et komplet dom\u00e6nenavn, mens andre kun returnerer host-delen af navnet.<\/p>\n<p>&nbsp;<\/p>\n<p>Oftest vil dette ikke v\u00e6re noget problem, da begge tekststrenge kan bruges til at oprette en forbindelse. Hvis man imidlertid har brug for at overf\u00f8re navnet p\u00e5 host\u2019en til andre computere, er den bedste fremgangsm\u00e5de at overf\u00f8re IP-nummer. Man kan finde IP-nummeret ved at kalde metoden getAddress.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h1>Gode r\u00e5d<\/h1>\n<p>&nbsp;<\/p>\n<p>Det forrige afsnit har beskrevet forskellige almindelige problemer, og hvordan disse undg\u00e5s. Dette afsnit vil give nogle gode, generelle r\u00e5d om, hvordan man udvikler programmer, der kan opn\u00e5 100% Pure Java-certificeringen.<\/p>\n<h2>Appletter<\/h2>\n<p>Det er forholdsvis kompliceret at skrive portable appletter. N\u00e5r en applets portablitet skal vurderes, ser man ikke kun p\u00e5 selve klassen, men ogs\u00e5 p\u00e5 den side, der indeholder apletten, den HTML-kode, som indel\u00e6ser programmet, og den security-manager og applet context, der anvendes p\u00e5 brugerens browser.<\/p>\n<p>I HTML-dokumentet skal indholdet af &lt;applet&gt;-kommandoen overholde f\u00f8lgende krav:<\/p>\n<ul>\n<li>Alle parametre (&lt;param&gt;) skal forekomme, f\u00f8r det alternative indhold.<\/li>\n<li>Det alternative indhold skal angives, som var det i et afsnit (&lt;p&gt;). Det betyder, at der ikke m\u00e5 v\u00e6re &lt;p&gt;-kommandoer i den alternative tekst.<\/li>\n<\/ul>\n<p>N\u00e6sten alle appletter bliver afviklet under en sikkerhedsmanager (<em>security manager<\/em>). Der er imidlertid ikke nogen standard for sikkerhedsmanagere. Brugeren kan indstille sin sikkerhedsmanager efter forgodtbefindende og kan s\u00e5ledes afvise alle mulige former for funktioner. Den bedste m\u00e5de at h\u00e5ndtere dette problem p\u00e5 er at h\u00e5ndtere alle opst\u00e5ede SecurityExceptions p\u00e5 en fornuftig m\u00e5de.<\/p>\n<p>Ligeledes definerer Java-standarden ikke hvilke protokoller, der kan anvendes fra appletter. Generelt er protokollerne http, ftp og file sikre. Det samme g\u00e6lder mime-typerne image\/jpeg og image\/gif. Igen g\u00e6lder det, at man skal v\u00e6re parat p\u00e5 at h\u00e5ndtere eventuelle fejl.<\/p>\n<h2>Sikkerhed<\/h2>\n<p>Hvis ens program bliver afviklet under en sikkerhedsmanager, kan der opst\u00e5 en SecurityException. Dette er en af de exceptions, der er <em>unchecked<\/em>. Det vil sige, at den kan opst\u00e5, selvom den ikke er defineret i en metodes throws-s\u00e6tning. Da brugeren har mulighed for selv at indstille sikkerhedsmanageren, er det sv\u00e6rt at sige, hvorn\u00e5r en SecurityException\u00a0kan opst\u00e5. Derfor anbefales det, at alle programmer h\u00e5ndterer eventuelle SecurityExceptions p\u00e5 en fornuftig m\u00e5de. Det betyder ikke, at man beh\u00f8ver at kontrollere, om der er opst\u00e5et en SecurityException efter hvert eneste metodekald. Man kan blot g\u00f8re det i main-metoden, da en unh\u00e5ndteret SecurityException i sidste ende vil ende her.<\/p>\n<p>&nbsp;<\/p>\n<h2>Fejl<\/h2>\n<p>&nbsp;<\/p>\n<p>Visse implementeringer af Java-platformen indeholder fejl. For at g\u00f8re sit program s\u00e5 portabelt som muligt, b\u00f8r man skrive sit program, s\u00e5 det undg\u00e5r kendte fejl i Java-implementeringer. Hvis man ved hvilke Java-implementeringer,<\/p>\n<p>&nbsp;<\/p>\n<p>der indeholder en given fejl, kan man kontrollere om man befinder sig p\u00e5 den p\u00e5g\u00e6ldende platform ved at kalde metoden System.getProperty(&#8220;java.maker&#8221;).<\/p>\n<p>&nbsp;<\/p>\n<h2>Undg\u00e5 risikofyldte metoder<\/h2>\n<p>&nbsp;<\/p>\n<p>Der er en r\u00e6kke metoder, som automatisk giver fejl i Java Pure Check, og som kan g\u00f8re, at ens program ikke kan certificeres. Der findes en oversigt over disse metoder og de fejl de giver i appendiks C.<\/p>\n<p>&nbsp;<\/p>\n<h1>Sammenfatning<\/h1>\n<p>&nbsp;<\/p>\n<p>I dette kapitel er det blevet gennemg\u00e5et, hvordan man kan f\u00e5 sine Java-programmer certificeret som 100% Pure Java. Der er ogs\u00e5 blevet givet gode r\u00e5d \u2013 s\u00e5vel generelle r\u00e5d som r\u00e5d om, hvordan man undg\u00e5r at beg\u00e5 de mest almindelige fejl.<\/p>\n<p>&nbsp;<\/p>\n<h1>FAQ<\/h1>\n<p>&nbsp;<\/p>\n<p><em>Hvorfor skal man bruge tid og penge p\u00e5 f\u00e5 sine produkter certificerede?<\/em><\/p>\n<p><em> <\/em><\/p>\n<p>Ved at benytte 100% Pure Java-logoet kan man forsikre sine kunder om, at ens produkt er platformsuafh\u00e6ngigt. Derudover giver certificeringen ogs\u00e5 adgang til en r\u00e6kke markedsf\u00f8ringsprogrammer i samarbejde med andre certificerede produkter og Sun.<\/p>\n<p>&nbsp;<\/p>\n<p><em>Skal produktet certificeres igen, hvis man \u00e6ndrer programmet for at rette en fejl?<\/em><\/p>\n<p><em> <\/em><\/p>\n<p>Nej. Hvis man kun retter fejl, kan man n\u00f8jes med at sende Sun en skriftlig erkl\u00e6ring om, at \u00e6ndringen ikke har indflydelse p\u00e5 portabiliteten af produktet.<\/p>\n<p>&nbsp;<\/p>\n<p><em>Skal produktet certificeres igen, hvis det udkommer i en ny version?<\/em><\/p>\n<p><em> <\/em><\/p>\n<p>Ja. Hvis produktet indeholder funktionalitet, der ikke tidligere er blevet testet, skal produktet certificeres igen.<\/p>\n<p>&nbsp;<\/p>\n<p><em>Kan certificeringen tilbagekaldes?<\/em><\/p>\n<p><em> <\/em><\/p>\n<p>Ja. Sun forbeholder sig ret til at tilbagekalde certificeringen, hvis kravene til at v\u00e6re certificeret ikke er opfyldt, selvom certificeringsprocessen er gennemg\u00e5et. Dette kan eksempelvis ske, hvis en producent af et certificeret produkt offentligt siger, at produktet ikke opfylder kravene til certificeringen \u2013 for eksempel ved ikke at v\u00e6re certificeret.<\/p>\n<p><em> <\/em><\/p>\n<div style=\"border: 1px solid red; color: red\">\n<b>Du l\u00e6ser en gammel bog<\/b><br \/>\nDen bog, du l\u00e6ser her, er fra 1998, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om de avancerede dele af Java, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0132354799)\"  target=\"_blank\">Core Java &#8211; Advanced Features<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" \/>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Java er designet med det form\u00e5l at v\u00e6re platformsuafh\u00e6ngigt. Alligevel indeholder sproget masser af muligheder for at bryde denne uafh\u00e6ngighed. For eksempel kan man bruge JNI, der kalder programmer, som er kompileret til maskinkode. For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":332,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-430","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"keywords\" content=\"java,pure,pure java,100% pure java,jni,portable,write once run anywhere,wora\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Biblioteket | Samling af artikler og b\u00f8ger\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"100% Pure Java | Biblioteket\" \/>\n\t\t<meta property=\"og:description\" content=\"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2011-11-05T06:45:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2011-11-05T06:47:46+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"100% Pure Java | Biblioteket\" \/>\n\t\t<meta name=\"twitter:description\" content=\"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-12-100-pure-java\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"position\":2,\"name\":\"B\\u00f8ger\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"name\":\"Avanceret Java-programmering\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"position\":3,\"name\":\"Avanceret Java-programmering\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-12-100-pure-java\\\/#listItem\",\"name\":\"Kapitel 12 100% pure Java\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-12-100-pure-java\\\/#listItem\",\"position\":4,\"name\":\"Kapitel 12 100% pure Java\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/#listItem\",\"name\":\"Avanceret Java-programmering\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-12-100-pure-java\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-12-100-pure-java\\\/\",\"name\":\"100% Pure Java | Biblioteket\",\"description\":\"For at man kan adskille de programmer, der virkeligt er platformsuafh\\u00e6ngige, fra de andre, har Sun indf\\u00f8rt begrebet 100% Pure Java. Programmer, der b\\u00e6rer dette logo, er fuldst\\u00e6ndigt portable.\",\"inLanguage\":\"da-DK\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/avanceret-java-programmering\\\/kapitel-12-100-pure-java\\\/#breadcrumblist\"},\"datePublished\":\"2011-11-05T08:45:28+02:00\",\"dateModified\":\"2011-11-05T08:47:46+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"inLanguage\":\"da-DK\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"100% Pure Java | Biblioteket","description":"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.","canonical_url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/","robots":"max-image-preview:large","keywords":"java,pure,pure java,100% pure java,jni,portable,write once run anywhere,wora","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","position":1,"name":"Home","item":"https:\/\/www.kristiansborg.dk\/bibliotek","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","position":2,"name":"B\u00f8ger","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","name":"Avanceret Java-programmering"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","position":3,"name":"Avanceret Java-programmering","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/#listItem","name":"Kapitel 12 100% pure Java"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/#listItem","position":4,"name":"Kapitel 12 100% pure Java","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/#listItem","name":"Avanceret Java-programmering"}}]},{"@type":"Organization","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/"},{"@type":"WebPage","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/#webpage","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/","name":"100% Pure Java | Biblioteket","description":"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.","inLanguage":"da-DK","isPartOf":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website"},"breadcrumb":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/#breadcrumblist"},"datePublished":"2011-11-05T08:45:28+02:00","dateModified":"2011-11-05T08:47:46+02:00"},{"@type":"WebSite","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","inLanguage":"da-DK","publisher":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization"}}]},"og:locale":"da_DK","og:site_name":"Biblioteket | Samling af artikler og b\u00f8ger","og:type":"article","og:title":"100% Pure Java | Biblioteket","og:description":"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.","og:url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/","article:published_time":"2011-11-05T06:45:28+00:00","article:modified_time":"2011-11-05T06:47:46+00:00","twitter:card":"summary","twitter:title":"100% Pure Java | Biblioteket","twitter:description":"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable."},"aioseo_meta_data":{"post_id":"430","title":"100% Pure Java | #site_title","description":"For at man kan adskille de programmer, der virkeligt er platformsuafh\u00e6ngige, fra de andre, har Sun indf\u00f8rt begrebet 100% Pure Java. Programmer, der b\u00e6rer dette logo, er fuldst\u00e6ndigt portable.","keywords":[{"label":"Java","value":"Java"},{"label":"pure","value":"pure"},{"label":"Pure Java","value":"Pure Java"},{"label":"100% pure java","value":"100% pure java"},{"label":"JNI","value":"JNI"},{"label":"portable","value":"portable"},{"label":"write once run anywhere","value":"write once run anywhere"},{"label":"wora","value":"wora"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-21 06:59:15","updated":"2025-06-04 02:18:22","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/\" title=\"B\u00f8ger\">B\u00f8ger<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/\" title=\"Avanceret Java-programmering\">Avanceret Java-programmering<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tKapitel 12 100% pure Java\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kristiansborg.dk\/bibliotek"},{"label":"B\u00f8ger","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/"},{"label":"Avanceret Java-programmering","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/"},{"label":"Kapitel 12 100% pure Java","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/avanceret-java-programmering\/kapitel-12-100-pure-java\/"}],"_links":{"self":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/comments?post=430"}],"version-history":[{"count":3,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/430\/revisions"}],"predecessor-version":[{"id":435,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/430\/revisions\/435"}],"up":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/332"}],"wp:attachment":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/media?parent=430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}