Как проверить версию JRE перед запуском? - PullRequest
12 голосов
/ 21 октября 2008

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

Ответы [ 13 ]

11 голосов
/ 21 октября 2008

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

9 голосов
/ 22 октября 2008

Вы можете рассмотреть 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 . Вы также можете написать какое-нибудь приложение для запуска, но это, как правило, не стоит усилий.

5 голосов
/ 21 октября 2008

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

http://commons.apache.org/launcher

2 голосов
/ 10 августа 2009

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

2 голосов
/ 21 октября 2008

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

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

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

1 голос
/ 14 апреля 2011

Вот код для установки версии 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);
1 голос
/ 21 июня 2010

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

1 голос
/ 21 октября 2008

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

Внутри приложения; как указано выше используйте 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);
}
...
1 голос
/ 21 октября 2008

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

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

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

0 голосов
/ 09 марта 2013

Все это слишком чертовски сложно. Просто иди:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...