2012-06-01 6 views
27

Potrzebuję najnowszej kompilacji wszystkich możliwych wartości właściwości os.arch w JRE 1.6 w systemach Linux, Solaris i Windows. Jeśli to możliwe, proszę podać źródło swoich ustaleń. Potrzebuję tych wartości, aby wybrać zasoby w moim pliku JNLP. Zasadniczo muszę przypisać różne pamięci JVM w oparciu o to, czy JRE jest 32-bitowe lub 64-bitowe. Oczekiwanie na odpowiedź. DziękiWszystkie możliwe wartości os.arch w 32-bitowym JRE i 64-bitowym Jre

Odpowiedz

8

Możesz również napisać kod jak poniżej, aby dowiedzieć się, jaki jest os i jego 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; 
    } 
} 

Patrz poniżej Linki

  1. https://github.com/trustin/os-maven-plugin/blob/master/src/main/java/kr/motd/maven/os/Detector.java

  2. https://github.com/rachelxqy/EligibilityCriteriaModeling/blob/57001f6d86084f074f4ca6aaff157e93ef6abf95/src/main/java/edu/mayo/bmi/medtagger/ml/util/PlatformDetection.java

+0

nie dać tę odpowiedź za nagrodę, ponieważ nie jest jasne, w jaki sposób niezawodny linki są. Wykrywają różne wartości 'os.arch' dla niektórych z tych samych architektur (np.' Powerpc' vs 'ppc'), i nie jest jasne, czy wiedzą, że wartości mogą wystąpić, czy jest to zabobonne kodowanie. Poza tym skopiowałeś jeden z nich i nie wiem, jaki jest jego stan praw autorskich. – Boann

6

najlepsze miejsce, gdzie można spojrzeć na to, że to w oddzielnym JDK.

Patrząc na java.lang.System widać, że właściwości są inicjowane w initializeSystemClass sposobu korzystania initProperties metody, która opiera się na natywnego kodu przy użyciu JNI:

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 
    ... 
    ... 
} 

Jeśli zaznaczysz źródło tego kodu natywnego nazwie z initProperties dla na różnych platformach można zobaczyć możliwe wartości właściwości systemu os.arch. Zrób to krok po kroku:

Najpierw spójrz na System.c, aby zobaczyć metodę JNI wywoływaną od java.lang.System.initProperties. Od 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); 

Więc jak widać os.arch pochodzi z PUTPROP(props, "os.arch", sprops->os_arch); i sprops to osiągnąć stosując java_props_t *sprops = GetJavaProperties(env);. więc pozwala spojrzeć na GetJavaProperties(env), metoda ta jest zdefiniowana w java_props.h jako:

java_props_t *GetJavaProperties(JNIEnv *env);

I wydaje się, że realizacja zależy od systemu operacyjnego.

W końcu szukam konkretnej implementacji dla GetJavaProperties; w systemie Windows Możliwe wartości, które można wykorzystać dla tej właściwości, to: ia64, amd64, lub unknown.widać z java_props_md.c file:

#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 

Dla Solaris wydaje się bardziej skomplikowana, ponieważ wartość nieruchomości w natywnym kodzie pochodzi z Makro zdefiniowane w java_props_md.c specyficzne dla systemu Solaris jako:

sprops.os_arch = ARCHPROPNAME; 

i to Macro to zdefiniowana w następujący sposób Makefile jak:

OTHER_CPPFLAGS += -DARCHPROPNAME='"$(ARCHPROP)"'

tak to wygląda tak jak to pochodzi ze środowiska, w którym jest skompilowane (przykro mi, że nie jestem ekspertem od C, zgaduję, ale może poprowadzę cię trochę).

W folderze Linux w src/linux/native/ nie ma java_props_md.c, więc przypuszczam, że w tym przypadku wziąć to samo źródło co solaris (Zgaduję ponownie ...).

UWAGA : Używam wersji 1.6, aby uzyskać te wartości, jednak nowe wartości mogą być dodawane w najnowszych wersjach java, więc sprawdź wymaganą wersję.

Nadzieja pomaga,

+0

Chociaż nie jest to kompletne rozwiązanie, dałem mu nagrodę, ponieważ starałeś się szukać wartości kanonicznych. Uwaga: Ze względów historycznych, w Javie przed jdk9 folder Solaris zawiera większość ogólnych rzeczy Uniksa, więc tak, kod ten dotyczyłby Linuksa. To niefortunne, jeśli wartość pochodzi ze środowiska, ponieważ oznacza to, że jego wartość jest * otwarta *. Miałem nadzieję na uporządkowany, kanoniczny zbiór możliwych wartości, bez potrzeby zabobonnego włączania wielu synonimów architektury, ale może to niemożliwe. – Boann

+0

@Boann dzięki za potwierdzenie o solaris i Linux. Najpierw przyjrzałem się dokumentacji, aby zobaczyć możliwe wartości dla 'os.arch', ale wydaje się, że nie ma oficjalnej informacji na ten temat ... tak więc patrzę bezpośrednio w kod; niestety nie daje to również informacji, których szukamy. W każdym razie dzięki za nagrodę ':)'. – albciff

Powiązane problemy