2012-06-01 12 views
27

में सभी संभावित मूल्य os.arch मुझे लिनक्स, सोलारिस और विंडोज पर जेआरई 1.6 में os.arch संपत्ति के सभी संभावित मूल्यों के नवीनतम संकलन की आवश्यकता है। यदि संभव हो तो कृपया अपने निष्कर्षों के स्रोत को उद्धृत करें। मुझे अपनी जेएनएलपी फ़ाइल में संसाधनों का चयन करने के लिए इन मानों की आवश्यकता है। मूल रूप से मुझे जेडई 32 बिट या 64 बिट के आधार पर अलग-अलग जेवीएम मेमोरी असाइन करने की आवश्यकता है। आपके उत्तर की प्रतीक्षा कर रहा है। धन्यवाद32 बिट जेआरई में और 64 बिट जेआर

उत्तर

8

आप ओएस और इसकी आर्की को खोजने के लिए नीचे कुछ कोड भी लिख सकते हैं।

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

नीचे देखें लिंक

  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

मैंने इस जवाब को बक्षीस नहीं दिया क्योंकि यह स्पष्ट नहीं है कि लिंक कितने विश्वसनीय हैं। वे कुछ आर्किटेक्चर (जैसे 'पावरपीसी' बनाम' पीपीसी') के लिए अलग-अलग 'os.arch' मानों का पता लगाते हैं), और यह स्पष्ट नहीं है कि वे जानते हैं कि मान हो सकते हैं या यदि यह अंधविश्वास कोडिंग है। इसके अलावा आप उनमें से एक को कॉपी-पेस्ट करते हैं और मुझे नहीं पता कि इसकी कॉपीराइट स्थिति क्या है। – Boann

6

सबसे अच्छी जगह जहां आप इसे खुद JDK में है इस के लिए देख सकते हैं।

java.lang.System पर देख रहे हैं आप देख सकते हैं कि गुण initProperties विधि है जो मूल कोड पर निर्भर करता है JNI का उपयोग कर का उपयोग कर initializeSystemClass विधि में प्रारंभ किया गया है:

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

आप के लिए initProperties से कहा जाता है इस मूल कोड के स्रोत की जांच विभिन्न प्लेटफ़ॉर्म आप os.arch सिस्टम प्रॉपर्टी के संभावित मान देख सकते हैं। तो इसे चरणबद्ध करें:

विधि से बुलाए गए JNI विधि को देखने के लिए पहले देखें। 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); 

से तो आप देख सकते रूप os.archPUTPROP(props, "os.arch", sprops->os_arch); से आता है और sprops यह हासिल की है java_props_t *sprops = GetJavaProperties(env); का उपयोग कर। तो देता है, GetJavaProperties(env) को देखने के लिए इस विधि का यह रूप java_props.h में परिभाषित किया गया है:

java_props_t *GetJavaProperties(JNIEnv *env);

और कार्यान्वयन लगता है कि ओएस पर निर्भर करता है।

तो आखिर में GetJavaProperties के लिए एक विशिष्ट कार्यान्वयन की तलाश में; विंडोज़ में संभावित मूल्य जो इस संपत्ति को ले सकते हैं ia64, amd64, x86, या unknown हैं।आप 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 

सोलारिस के लिए और अधिक जटिल लगता है के बाद से मूल कोड में संपत्ति के मूल्य के रूप में सोलारिस के लिए java_props_md.c विशिष्ट में परिभाषित मैक्रो से आता है:

sprops.os_arch = ARCHPROPNAME; 

और यह मैक्रो यह है इस प्रकार Makefile में परिभाषित:

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

तो यह लग रहा है जैसे पर्यावरण से आता है, जहां इसे संकलित किया जाता है (खेद है कि मैं सी विशेषज्ञ नहीं हूं, मैं बस अनुमान लगा रहा हूं हालांकि शायद मैं आपको थोड़ा सा मार्गदर्शन कर सकता हूं)।

src/linux/native/ में लिनक्स फ़ोल्डर में java_props_md.c नहीं है इसलिए मुझे लगता है कि इस मामले में सौर स्रोत के रूप में एक ही स्रोत लें (मैं फिर से अनुमान लगा रहा हूं ...)।

नोट: मैं यह मान प्राप्त करने के लिए 1.6 संस्करण का उपयोग करता हूं, हालांकि नए संस्करणों को नए जावा संस्करणों में जोड़ा जा सकता है, इसलिए अपना आवश्यक संस्करण देखें।

उम्मीद है कि यह मदद करता है,

+0

हालांकि यह एक पूर्ण समाधान नहीं है, लेकिन मैंने इसे बक्षीस दिया क्योंकि आपने वैधानिक मूल्यों को देखने का प्रयास किया था। नोट: ऐतिहासिक कारणों से, jdk9 से पहले जावा में सोलारिस फ़ोल्डर में सामान्य जेनिक्स यूनिक्स की अधिकांश चीज़ें होती हैं, इसलिए हाँ, वह कोड लिनक्स पर लागू होगा। यह दुर्भाग्यपूर्ण है कि मूल्य पर्यावरण से आता है क्योंकि इसका मतलब है कि इसका मूल्य * ओपन-एंड * है। मैं बहुत सारे आर्किटेक्चर समानार्थियों के अंधविश्वास को शामिल किए बिना संभावित मूल्यों की एक साफ, कैनोलिक तालिका की उम्मीद करता था, लेकिन शायद यह असंभव है। – Boann

+0

@ बोआन सौर और लिनक्स के बारे में पुष्टि के लिए धन्यवाद। सबसे पहले मैं 'os.arch' के संभावित मान देखने के लिए प्रलेखन देख रहा हूं लेकिन ऐसा लगता है कि इसके बारे में कोई आधिकारिक जानकारी नहीं है ... तो फिर मैं सीधे कोड में देखता हूं; दुर्भाग्य से यह वह जानकारी भी नहीं देता है जिसे हम ढूंढ रहे हैं। वैसे भी बक्षीस के लिए धन्यवाद ':) '। – albciff

संबंधित मुद्दे