java - Kodning mod OS-specifikke JRE'er

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har kode, der bygger på NTSystem-klassen (com.sun.security.auth.module.NTSystem), som findes i rt.jar for Windows JREs. Men når jeg kompilerer min klasse på en Linux-maskine, fejler den, fordi denne klasse ikke leveres med Linux JDK/JRE.


Nu, når du kører koden, er det fornuftigt, at jeg ikke kunne bruge NTSystem-klassen og dens funktioner. Men min kode er smart nok til at bestemme, hvilken OS den kører på, og at bruge de relevante klasser.


Omvendt udvikler jeg i Windows, har jeg ikke adgang til com.sun.security.auth.module.UnixSystem. Er jeg nødt til at bruge refleksion til at indlæse og bruge disse klasser på grund af en kompilering af tidsbegrænsning? Eller er der en særlig RT .jar, der har alle klasserne i det til bygningsformål?


Tak på forhånd.

Bedste reference


Opret JAAS-konfigurationsfiler for hver målplatform eller oprett poster for hver platform i en enkelt JAAS-konfiguration. Få adgang til oplysningerne via Java SE API'er uden at bruge com.sun. * Pakkerne direkte. Dette kan udføres via Java Authentication and Authorization Service (JAAS) (javax.security.auth. * Og javax.security.auth.login. *). Opret en JAAS-konfigurationsfil med følgende post: [5] [6] [7]


sampleApp {
    com.sun.security.auth.module.NTLoginModule required debug=false;
};


Gem denne post som sampleapp\_jaas.config. Næste sæt systemegenskaben, så Java vil kigge efter config filen.


-Djava.security.auth.login.config==sampleapp\_jaas.config


Bemærk at de dobbelte lige har en særlig betydning. Se com.sun.security.auth.login.ConfigFile for detaljer om belastningsordren. [8]


Opret derefter LoginContext, der vil se efter indgangen i JAAS-konfigurationen. Ring til login for at udfylde emnet. Derfra kan du få adgang til oplysninger ved hjælp af emne-API. For eksempel viser det følgende eksempel bare de grupper, der er tildelt den aktuelle bruger.


LoginContext l = new LoginContext("sampleApp");
l.login();
try {
    Subject s = l.getSubject();
    for (Principal p : s.getPrincipals()) {
        System.out.println(p);
    }
} finally {
    l.logout();
}


Ved hjælp af denne opsætning bruger Java klassen com.sun.security.auth.module.NTSystem til at få oplysningerne, men ingen af ​​din kode vil blive hardwired til de ikke-standardiserede API'er.

Andre referencer 1


Hvis du virkelig har brug for disse OS-specifikke klasser, ville jeg få kilden til dem, kompilere dem og oprette dit eget lille bibliotek for at kompilere imod. 9Om du kan bruge en kopi af klasserne fra forskellige installationer)


Jeg tror OpenJDK har op til tre varianter (inklusive Solaris), så det ville ikke være for svært at oprette et simpelt bibliotek af dem alle.