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
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
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,
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
@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
- 1. MXMLC i 64bit JRE
- 2. JRE dołączone do JDK kontra samodzielny JRE
- 3. Instalacja jądra Java JRE?
- 4. Java JRE vs GCJ
- 5. Docelowa inna wersja JRE
- 6. JVM Implementacja JRE
- 7. Wiązanie JDK/JRE
- 8. Instalacja Glassfish JRE nie znaleziono
- 9. Brak biblioteki narzędzi JRE tools.jar
- 10. określona instalacja JRE nie istnieje
- 11. Jaka jest różnica między openjdk-7-jre-headless i openjdk-7-jre (jdk)?
- 12. Kod źródłowy JDK/JRE z pasującym kodem źródłowym JSSE (SSL) i pasującym działającym JDK/JRE?
- 13. Jakie są główne różnice w uruchamianiu aplikacji w środowisku JRE serwera względem środowiska JRE?
- 14. Ograniczanie zestawów szyfrów na poziomie JRE
- 15. Jak używać opcji JRE pakietu w Launch4j
- 16. Katalog instalacyjny JRE w systemie Windows
- 17. Określanie architektury JRE w wersji 32-bitowej i 64-bitowej
- 18. Jak uruchomić Eclipse bez uruchamiania instalacji JRE?
- 19. Maven mylić o JRE został użyty
- 20. Webstart biegnie z niewłaściwej wersji JRE
- 21. Jak wyodrębnić plik jre-9/lib/modules?
- 22. Jaki tomcat wymaga JDK lub JRE?
- 23. Docker instalacja debian openjdk-7-jre
- 24. JRE zawiesza się podczas uruchamiania zapytań sqlite
- 25. Ograniczenia dostępu dla jdk1.7/jre/lib/rt.jar
- 26. Błąd PyLucene z IceTea/JDK/JRE
- 27. Gdzie mogę znaleźć stare wersje JDK i JRE?
- 28. Punkty przerw w bibliotece systemu JRE w Eclipse
- 29. Wszystkie moje projekty java dają błędy po zainstalowaniu nowego JRE w Eclipse
- 30. Czy można skompilować świetny kod do działania w środowisku JRE?
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