Ich benötige die neueste Kompilierung aller möglichen Werte der os.arch-Eigenschaft in JRE 1.6 unter Linux, Solaris und Windows. Wenn möglich, bitte zitieren Sie die Quelle Ihrer Ergebnisse. Ich brauche diese Werte, um Ressourcen in meiner JNLP-Datei auszuwählen. Grundsätzlich muss ich unterschiedliche JVM-Speicher basierend darauf zuweisen, ob die JRE 32 Bit oder 64 Bit ist. Warten auf Ihre Antwort. DankeAlle möglichen Werte os.arch in 32bit JRE und in 64bit Jre
Antwort
Sie können auch etwas Code wie unten schreiben, um herauszufinden, os und seine archi.
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.SystemUtils;
public class PlatformDetection {
private String os;
private String arch;
public static String OS_WINDOWS = "windows";
public static String OS_OSX = "osx";
public static String OS_SOLARIS = "solaris";
public static String OS_LINUX = "linux";
public static String ARCH_PPC = "ppc";
public static String ARCH_X86_32 = "x86_32";
public static String ARCH_X86_64 = "x86_64";
public PlatformDetection() {
// resolve OS
if (SystemUtils.IS_OS_WINDOWS) {
this.os = OS_WINDOWS;
} else if (SystemUtils.IS_OS_MAC_OSX) {
this.os = OS_OSX;
} else if (SystemUtils.IS_OS_SOLARIS) {
this.os = OS_SOLARIS;
} else if (SystemUtils.IS_OS_LINUX) {
this.os = OS_LINUX;
} else {
throw new IllegalArgumentException("Unknown operating system " + SystemUtils.OS_NAME);
}
// resolve architecture
Map<String, String> archMap = new HashMap<String, String>();
archMap.put("x86", ARCH_X86_32);
archMap.put("i386", ARCH_X86_32);
archMap.put("i486", ARCH_X86_32);
archMap.put("i586", ARCH_X86_32);
archMap.put("i686", ARCH_X86_32);
archMap.put("x86_64", ARCH_X86_64);
archMap.put("amd64", ARCH_X86_64);
archMap.put("powerpc", ARCH_PPC);
this.arch = archMap.get(SystemUtils.OS_ARCH);
if (this.arch == null) {
throw new IllegalArgumentException("Unknown architecture " + SystemUtils.OS_ARCH);
}
}
public String getOs() {
return os;
}
public String getArch() {
return arch;
}
public void setArch(String arch) {
this.arch = arch;
}
public void setOs(String os) {
this.os = os;
}
public String toString() {
return os + "_" + arch;
}
}
Siehe Links unten,
Der beste Ort, wo man für diese aussehen können, ist es in der eigenen jdk.
Blick auf java.lang.System
können Sie sehen, dass die Eigenschaften in initializeSystemClass
Methode initProperties
Methode initialisiert werden, die unter Verwendung von JNI
auf nativen Code beruht:
private static native Properties initProperties(Properties props);
/**
* Initialize the system class. Called after thread initialization.
*/
private static void initializeSystemClass() {
// VM might invoke JNU_NewStringPlatform() to set those encoding
// sensitive properties (user.home, user.name, boot.class.path, etc.)
// during "props" initialization, in which it may need access, via
// System.getProperty(), to the related system encoding property that
// have been initialized (put into "props") at early stage of the
// initialization. So make sure the "props" is available at the
// very beginning of the initialization and all system properties to
// be put into it directly.
props = new Properties();
initProperties(props); // initialized by the VM
...
...
}
Wenn Sie die Quelle dieses nativen Code von initProperties
für die angerufene überprüfen verschiedene Plattformen können Sie die möglichen Werte für os.arch
Systemeigenschaft sehen. So tun es Schritt für Schritt:
Zuerst Blick auf System.c
, um die JNI
Methode von java.lang.System.initProperties
genannt zu sehen. So Von System.c
JNIEXPORT jobject JNICALL
Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
{
char buf[128];
java_props_t *sprops = GetJavaProperties(env);
jmethodID putID = (*env)->GetMethodID(env,
(*env)->GetObjectClass(env, props),
"put",
"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
if (sprops == NULL || putID == NULL) return NULL;
PUTPROP(props, "java.specification.version",
JDK_MAJOR_VERSION "." JDK_MINOR_VERSION);
PUTPROP(props, "java.specification.name",
"Java Platform API Specification");
PUTPROP(props, "java.specification.vendor", "Sun Microsystems Inc.");
PUTPROP(props, "java.version", RELEASE);
PUTPROP(props, "java.vendor", VENDOR);
PUTPROP(props, "java.vendor.url", VENDOR_URL);
PUTPROP(props, "java.vendor.url.bug", VENDOR_URL_BUG);
...
/* os properties */
PUTPROP(props, "os.name", sprops->os_name);
PUTPROP(props, "os.version", sprops->os_version);
// HERE IS THE `os.arch` PROPERTY :)
PUTPROP(props, "os.arch", sprops->os_arch);
wie Sie sehen können die os.arch
kommt von PUTPROP(props, "os.arch", sprops->os_arch);
und die sprops
erreicht ist mit java_props_t *sprops = GetJavaProperties(env);
. so kann bei GetJavaProperties(env)
, diese Methode sieht es in java_props.h
definiert ist:
java_props_t *GetJavaProperties(JNIEnv *env);
Und die Umsetzung scheint, dass auf O abhängt.
So schließlich eine spezifische Implementierung für GetJavaProperties
; in Windows die möglichen Werte, die diese Eigenschaft annehmen kann, sind ia64
, amd64
, x86
oder unknown
.Sie können von java_props_md.c
file sehen:
#if _M_IA64
sprops.os_arch = "ia64";
#elif _M_AMD64
sprops.os_arch = "amd64";
#elif _X86_
sprops.os_arch = "x86";
#else
sprops.os_arch = "unknown";
#endif
Für Solaris komplizierter scheint, da der Wert der Eigenschaft in den nativen Code aus einem in der java_props_md.c
spezifisch für solaris definiert Macro kommt:
sprops.os_arch = ARCHPROPNAME;
Und dieses Makro ist es definiert in der Folge Makefile
wie:
OTHER_CPPFLAGS += -DARCHPROPNAME='"$(ARCHPROP)"'
so sieht es aus So kommt es aus der Umgebung, wo es kompiliert wurde (Entschuldigung, ich bin kein C-Experte, ich rate nur, aber vielleicht kann ich dich ein bisschen führen).
In dem Linux-Ordner in src/linux/native/
gibt es keine java_props_md.c
also nehme ich an, dass in diesem Fall die gleiche Quelle wie Solaris nehmen (ich rate wieder ...).
HINWEIS: Ich verwende die Version 1.6, um diese Werte zu erhalten, aber neue Werte können in den neuesten Java-Versionen hinzugefügt werden, überprüfen Sie daher Ihre benötigte Version.
Hoffe, dass es hilft,
Obwohl dies keine vollständige Lösung ist, habe ich ihm die Prämie gegeben, weil Sie sich bemüht haben, nach den kanonischen Werten zu suchen. Hinweis: Aus historischen Gründen enthält der Solaris-Ordner in Java vor jdk9 die meisten generischen Unix-Komponenten. Dieser Code würde also für Linux gelten. Es ist bedauerlich, wenn der Wert von der Umgebung kommt, da dies bedeutet, dass der Wert * offen * ist. Ich hatte auf eine saubere, kanonische Tabelle mit möglichen Werten gehofft, ohne die Aberglaube vieler architektonischer Synonyme einzubeziehen, aber vielleicht ist das unmöglich. – Boann
@Boann danke für die bestätigung über solaris und linux. Zuerst schaue ich mir die Dokumentation an, um die möglichen Werte für "os.arch" zu sehen, aber es scheint, dass es keine offiziellen Informationen darüber gibt ... also schaue ich direkt in den Code; leider gibt dies auch nicht die Informationen, nach denen wir suchen. Trotzdem danke für das Kopfgeld ':)'. – albciff
- 1. MXMLC und 64bit JRE
- 2. Unterschied zwischen Server JRE und Client JRE
- 3. Xerces-Abhängigkeit und JRE
- 4. Einstellung JRE in Netbeans
- 5. Run. Klasse &. Jre mit tragbaren JRE
- 6. JRE Ablaufdatum
- 7. eine neue JRE in Eclipse
- 8. Unterschied zwischen openjdk-6-jre, openjdk-6-jre-kopflos, openjdk-6-jre-lib
- 9. 32bit 64bit referenzierten Bibliothek
- 10. Eclipse erkennt JRE 8 nicht größer als JRE 5
- 11. JRE im Lieferumfang von JDK vs. standalone JRE
- 12. JRE-Systembibliothek fehlt tools.jar
- 13. JVM Implementieren von JRE
- 14. JRE programmgesteuert herunterladen?
- 15. JRE Systembibliothek nicht gefunden Ausnahme in Eclipse
- 16. Verhalten Unterschied zwischen 32bit und 64bit
- 17. Inno Setup 32bit und 64bit dll installation
- 18. 64bit und 32bit Prozess Sprech boost :: message_queue
- 19. Verwechselt 32Bit und 64Bit geteilte Objekte/Bibliotheken
- 20. lesen von 32bit record in 64bit projekt
- 21. Install-Basis von Java JRE?
- 22. Aptana 3.6.0 jre Fehler in Windows OS
- 23. StartCom-CA-Zertifikate in Windows JRE importieren
- 24. Kann nicht Schriftart in JRE laden 8
- 25. Was ist der Unterschied zwischen openjdk-7-jre-headless und openjdk-7-jre (jdk)?
- 26. Eclipse: Verschiedene JRE-Versionen erstellen und anpassen
- 27. jtds ArrayIndexOutOfBoundsException on Jre 1.8.66
- 28. Was sind die Hauptunterschiede beim Ausführen meiner Anwendung in einer Server JRE vs JRE?
- 29. Ziel verschiedene Version von JRE
- 30. Verpackung mit einer kleineren JRE
ich diese Antwort nicht die Prämie gegeben hat, weil nicht klar ist, wie zuverlässig die Links sind. Sie erkennen verschiedene 'os.arch'-Werte für einige derselben Architekturen (z.B.' powerpc' gegen 'ppc') und es ist nicht klar, ob sie wissen, dass die Werte auftreten können oder ob es sich um eine abergläubische Codierung handelt. Außerdem kopierst du einen von ihnen hier und ich weiß nicht, wie sein Copyright-Status ist. – Boann