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

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

13 ответов


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

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

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


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


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


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

http://commons.apache.org/launcher


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

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

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


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


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

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

Мда .. назовите меня скучным парнем, но что плохого в использовании 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)