Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

http://commons.apache.org/launcher

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top