Как проверить версию JRE до запуска?

Какой лучший способ определить, является ли версия JRE, установленная на компьютере, достаточно высокой для приложения, которое пользователь хочет запустить? Есть ли способ сделать это, используя только java-материал? Я хотел бы, чтобы решение работало в Windows/Linux/MacOSX - если версия JRE слишком низкая, сообщение должно отображаться. В настоящее время я получаю исключение, если я пытаюсь запустить его на Java 1.5 (приложение построено для Java 1.6). Если нет универсального решения, какой лучший способ сделать это в Windows?

Ответ 1

Приложение, созданное для JRE с более высокой версией, не будет работать на JRE с более низкой версией. Таким образом, вы не сможете просто добавить код в свое приложение, чтобы проверить версию JRE - если версия JRE несовместима, ваш код проверки JRE-версии не будет работать в первую очередь.

Что вам нужно сделать, это иметь какое-то приложение для запуска, которое создано для более низкой версии JRE (1.3?), которая проверяет версию, а затем запускает ваше приложение, если это необходимо. Это звучит для меня как-то вроде kludgy.

Как насчет проверки версии во время установки? Вы устанавливаете приложение таким образом, чтобы вы могли проверять переменные среды или выполнять какие-либо сценарии?

Ответ 2

Вы можете сделать это, используя отражение и два компилятора. Скомпилируйте основной класс со старейшей версией java, с которой вы хотите работать. Он проверяет версию с помощью System.getProperty("java.version") или что-то в этом роде, а затем использует отражение для загрузки вашего реального основного класса, если эта проверка проходит, возможно, даже напрямую загружая банку. JRE не должен загружать классы, на которые не ссылался ваш внешний основной класс во время компиляции.

Ответ 3

Вы можете рассмотреть Java Webstart. Даже если название подразумевает нечто вроде апплетов, это касается автономных приложений. Webstart - это программа запуска, которая проверяет JNLP файл (простой XML файл, где вы настраиваете местоположение загрузки вашего приложения, необходимую версию Java и некоторые другие метаданные) и запускает ваше приложение с помощью правильной JRE. Он даже обновляет приложение, если доступна более новая версия. Недостатком является то, что вы должны написать JNLP файл. Вот пример:

<?xml version="1.0" encoding="utf-8"?>

<!--
###############################################################################
#
# @(#)draw.jnlp 1.6 02/09/11
#
# JNLP File for Draw Demo Application
#
###############################################################################
 -->


<jnlp spec="0.2 1.0"
      codebase="http://java.sun.com/javase/technologies/desktop/javawebstart/apps"
      href="draw.jnlp">
   <information> 
      <title>Draw 4 App</title> 
      <vendor>Sun Microsystems, Inc.</vendor>
      <homepage href="http://java.sun.com/javase/technologies/desktop/javawebstart/demos.html"/>
      <description>A minimalist drawing application along the lines of Illustrator</description>
      <description kind="short">Draw Demo Short Description</description>
      <icon href="images/draw.jpg"/>
      <offline-allowed/> 
   </information> 
   <resources>
      <j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/>
      <j2se version="1.3+"/>
      <jar href="draw.jar" main="true" download="eager"/>
   </resources>
   <application-desc main-class="Draw"/>
</jnlp> 

Вторая возможность - использовать программу запуска. Примером может служить Apache Commons Launcher. Вы также можете написать какое-то приложение для запуска, но это обычно не стоит усилий.

Ответ 4

Вы также можете использовать Commons-Launcher, который позволяет настраивать различные параметры среды или выполнять предварительные проверки перед вызовом вашего приложения.

http://commons.apache.org/launcher

Ответ 5

Как правило, мы обратились к этому с помощью оболочки оболочки C или (только в unix-only). Не уверен, что это действительно сработает для вас.

Мы также подходим к этому, встраивая JRE в наш продукт. Берет 99,9% случаев (остальные 0,1% времени - это пользователь, который явно меняет нашу конфигурацию, чтобы использовать другую JVM). Опять же, не уверен, что это разумное решение для вас.

В нашем случае существует значительный объем нативного кода (JNI и т.д.), поэтому поэтапная настройка устанавливаемого изображения для каждой поддерживаемой нами платформы требуется в любом случае. Но если вы имеете дело с чистым Java-решением, вам просто нужно документировать свой минимум и рассказывать людям, чтобы они могли работать с программой (без каламбура), если они должны запускать ваши вещи. Это похоже на то, что люди жалуются на то, что мой Mac не будет запускать MSVC, или что в моем ящике Linux возникают проблемы с запуском World of Warcraft. Это просто не (виртуальная) машина, на которую нацелено программное обеспечение - вам нужно переключиться. По крайней мере, в мире Java, мы действительно можем назвать это модернизацией, хотя и не навредив никому OS-религиозным чувствам. (Попробуйте указать пользователю Mac "обновить" до Windows XP для запуска MSVC - там будет ожидание ожидания).

Ответ 6

При запуске команды Java может потребоваться версия Java. java -version:1.6* com.me.MyClass. Не уверен, что это работает во всех версиях Java, но все равно работает нормально на 1.6.

Ответ 7

Для пусковой установки - проверьте версию там.

Внутри APP; как описано выше, используйте System.getProperties();

Properties sProp = java.lang.System.getProperties();
String sVersion = sProp.getProperty("java.version");
sVersion = sVersion.substring(0, 3);
Float f = Float.valueOf(sVersion);
if (f.floatValue() < (float) 1.4) {
    System.out.println("Java version too low ....");
    System.exit(1);
}
...

Ответ 8

У класса запуска, скомпилированного для Java 1.2, который вызывает реальный main() в ваших 1.6 классах. Если выбрано неподдерживаемое исключение класса, он их поймает и отобразит приятное сообщение об ошибке.

Ответ 9

Вот код, чтобы получить версию JRE, установленную в системе.

var list = deployJava.getJREs();
var result = "";
result = list[0];
for (var i=1; i<list.length; i++)
{
    result += ", " + list[i];
} 
document.write("jre version : "+result);

Ответ 10

System.getProperties() предоставляет вам список свойств JVM, включая идентификаторы другой версии JRE, JVM и спецификации. Это реализовано для всех версий Java, поэтому должно работать независимо от версии, скомпилированной в версии и версии, или реализации.

Если вы пишете базовый класс для тестирования версии, вы можете вызвать это сначала в своем классе запуска(). На самом деле это должна быть базовая функциональность, или вы можете рискнуть ее сломать.

Ответ 11

Хм.. назовите меня скучным парнем, но что не так с использованием Launch4J или любой другой родной пусковой установки, например.

Используйте собственный пусковой механизм, чтобы проверить версию JVM, прежде чем запускать свой код. Решения на базе Java (в моей книге) имеют смысл только тогда, когда вы имеете дело с разработчиками; как только вы нажмете конечных пользователей, вы поймете, что они вообще не заботятся о Java или ее технических деталях. Если бы вы написали свое приложение в GW-Basic, им было бы все равно, пока ваше приложение работает.

Если Java 1.6 не установлен, lauchner4j направит пользователя на страницу загрузки для JDK 1.6. Это скорее подходит для вашей проблемы, чем для магии на Java.

Ответ 12

Я нахожу, что WinRun4J работает для меня хорошо (но с другой стороны, я могу быть предвзятым с тех пор Я написал это:-)). Это позволяет указать минимальную и/или максимальную допустимую версию Java. Он откроет окно сообщения пользователю, если подходящая версия JRE не найдена (и это сообщение настраивается).

Ответ 13

Все вышеперечисленное слишком сложно. Просто зайдите:

Properties props = System.getProperties()
props.list(System.out)

И вы увидите все о вашей JVM, JRE, JDK и персонале. Или получите определенное значение, используя:

//full list of possible props you can see if u run code above
String props = System.getProperty(prop)