Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение версии java, Необходимо определить версию java 
V
    Опции темы
Bodro
Дата 18.3.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Добрый день!

Подскажите, пожалуйста, как мне определить версию установленной JAVA из программы (JAR). Возможно ли это?

Проблема такая. Есть ПО в виде jar-файла. Работает под java 1.6:
Код

C:\Documents and Settings\Administrator>java -version
java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Client VM (build 11.2-b01, mixed mode, sharing)


Но не у всех пользователей установлена именно версия 1.6. На более ранних падает:
Код

c:\Program Files\Java\jre1.5.0_16\bin>java -version
java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)
Java HotSpot(TM) Client VM (build 1.5.0_16-b02, mixed mode, sharing)

c:\Program Files\Java\jre1.5.0_16\bin>java -jar c:\WORK\RightSizer.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version n
umber in .class file
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

c:\Program Files\Java\jre1.5.0_16\bin>


Возожно ли каким-либо образом при запуске jar определить, какая версия установлена и внятно пользователю сообщить о необходимости установить последнюю версию? Принимаются любые идеи! Спасибо большое!
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 18.3.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Пишешь маленький jar который будет проверять версию JDK (проверить можно через System.getProperty("java.version")).
Далее если с версией все ОК, то запускаешь саму программу, иначе выдаешь сообщение об ошибке.

P.S. Запускальщик конечно надо собирать под самой старой JDK.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Samotnik
Дата 18.3.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Код

System.getProperty("java.version")


Добавлено через 1 минуту
лсд опередил  smile 
PM MAIL   Вверх
Bodro
Дата 18.3.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Да, я думал над запускальщиком. Идея хорошая. Но проблема в том, что сборка всех проектов ведётся на одной машине и там установлена только одна версия и собирать можно на ней. Вряд ли получится собрать под более старой версией.

А если создать запускальщик на этой же версии? Только сделать его примитивным. Старые версии подцепят его?
Нет там никаких различий в магических числах файлов и прочим?


Неужели никак нельзя из самого приложения определеить? Ну как нибудь там ClassLoader перегрузить или ещё что?
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 18.3.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Bodro @  18.3.2009,  13:36 Найти цитируемый пост)
Но проблема в том, что сборка всех проектов ведётся на одной машине и там установлена только одна версия и собирать можно на ней. Вряд ли получится собрать под более старой версией.

Это как раз не проблема. У компилятора есть опция которая позволяет генерировать код под более ранние версии JDK. Главное не использовать API которого не было в этих версиях (тег Since в помощь smile ). И кстати делать несколько разных jar не обязательно, можно ограничиться одним.


Цитата(Bodro @  18.3.2009,  13:36 Найти цитируемый пост)
Неужели никак нельзя из самого приложения определеить?

Проблема в том, что старые версии JDK не могут читать формат классов от более новых. А раз так, то они не могут вообще выполнить ни один класс из твоего приложения.


Цитата(Bodro @  18.3.2009,  13:36 Найти цитируемый пост)
Ну как нибудь там ClassLoader перегрузить или ещё что?

1. Переопределить bootstrap class loader практически нереально.
2. Для этого надо модифицировать JRE. Как ты это собираешься делать?
3. Это гораздо сложнее чем написать стартер.

Есть ещё вариант нативного запускальщика, например exe4j или JSmooth.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bodro
Дата 18.3.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Спасибо огромное!

Пожалуй, это действительно лучшее решение.

А не знаешь ли каких-либо программ, которые помогли бы реализовать подобное, но только не exe, а jar? Ну или хотя бы exe и ещё elf? Например, для создания EXE-файлов существует программа Launch4j. Это помимо тех, которые ты написал. Она позволяет запихать в себя jar-файл и берёт на себя задачу по определению версии jre и прочее. Но мне надо чтобы была кросплатформенность или поддержка хотя бы Windows и Linux.

Дело в том что решение использовать Java было принято по трём причинам: простота и удобство разработки, реализация в виде апплета и кростплатформенность. Если с апплетом всё понятно, то вот с standalone tool проблема. Необходимо проверить версию при запуске.

Это сообщение отредактировал(а) Bodro - 18.3.2009, 16:40
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 18.3.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Bodro @  18.3.2009,  15:48 Найти цитируемый пост)
Но мне надо чтобы была кросплатформенность или поддержка хотя бы Windows и Linux.

Дык Launch4j же поддерживает:
Цитата
Features
  * Launch4j wraps jars in Windows native executables and allows to run them like a regular Windows program. It's possible to wrap applications on Windows, Linux, Mac OS X and Solaris!



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bodro
Дата 18.3.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Да не, ты не понял. Launch4j поддерживает платформы сам. Т.е. он написан на Java, поэтому запускается на них на всех, но на выходе я получу только файл PE EXE. А мне нужно получить на выходе или JAR или PE EXE, ELF, a.out и т.п.

Не знаешь такой софт?
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
SoulKeeper
Дата 18.3.2009, 18:24 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Код

public class VersionCheck{

    public static void main(String[] args){
        System.out.println(System.getProperty("java.version"));
    }
}


Код

javac -target 1.1 -source 1.2 VersionCheck.java


Так не покатит?
PM MAIL   Вверх
LSD
Дата 18.3.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Попробуй Java Service Wrapper.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bodro
Дата 19.3.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Спасибо огромное всем за советы! Учёл всё!

Начальник сказал делать загрузчик при этом соблюдая кроссплатформенность, т.е. загрузчик писать на Java.
Но небольшая трудность в том, что мы используем в проекте One-Jar (подробности тут: http://one-jar.sourceforge.net/).

Так что сейчас пишу загрузчик, пытаюсь всё это собрать с помощью проекта One-Jar (чтобы в результате по прежнему был один файл, но была проверка на версию, которая должна сработать до OneJar).

Результаты обязательно выложу и опишу.

Это сообщение отредактировал(а) Bodro - 20.3.2009, 13:31
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Bodro
Дата 20.3.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



В общем, загрузчик готов. Выложу только основную часть:
Код

public class Launcher{
    public static void main(String[] args) throws Exception, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{
        String verStr = null;
        double verNum = 0D;
        Class comparemyvm = null;
        Method m = null;
        Class [] params = null;
        
        verStr = System.getProperty("java.version");
        verStr = verStr.substring(0, 3);

        verNum = Double.parseDouble(verStr);

        System.out.print("JRE version: " + verNum + " - ");
        
        if(verNum >= MIN_VERSION){
            System.out.println("OK");

            comparemyvm = Class.forName(LOAD_CLASS_NAME);
            comparemyvm.newInstance();

            params = new Class[1];
            params[0] = String[].class;

            m = comparemyvm.getMethod("main", params);

            m.invoke(null, new Object[] {args});
        }else{
            System.out.println("FAILED");
            System.out.println("The application requires a Java Runtime Environment 1.6 or later");
            System.out.println("http://java.com/download");

            ErrorFrame frame = new ErrorFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            frame.setResizable(false);
            frame.setTitle("Wrong Java version");
        }
    }
    
    public static final double MIN_VERSION  = 1.6;
    public static final String LOAD_CLASS_NAME = "com.simontuffs.onejar.Boot";
}


Теперь поясняю работу всего проекта в целом (механизм загрузки):
есть проект, который выполняет основную работу. Он подразумевался использоваться как апплет. Поэтому ant скрипт был написано таким образом, чтобы генерить множество jar файлов (проект большой, много библиотек). Затем возникла потребность сделать из проекта так же standalone tool. Переделки в коде минимальные. Но проблема во множестве jar файлов. Архив поставлять нельзя, дистрибутив, если это действительно удобный дистрибутив, писать долго и сложно. Была задача собрать один jar файл.
Я думал и в итоге решил использовать проект OneJar (http://one-jar.sourceforge.net/). Суть его такова:
пишется специальный ant-скрипт, расширенный с помощью OneJar. Указываются какие необходимо кидать jar и указывается точка входа.
Затем, при запуске скрипта, он собирает один jar файл, в котором точка входа, это метод main в загрузчике OneJar. И этот загрузчик загружает проект.
Проект работает исключительно под JRE 1.6.0 и выше. Значит, неоходимо определить, какая версия JRE установлена и в случае несоответствия, предупредить пользователя. Проблема описана вверху.
Спасибо всем на фруме. Объяснил начальству все варианты, какие мог придумать. Решено было сохранить кроссплатформенное приложение. Т.е. задача встала такая - писать загрузчик под наиболее низкую версию:
Код

javac -target 1.1 -source 1.2 Launcher.java

Суть такая. Есть готовый jar файл, собранный с помощью OneJar. Я собираю загрузчик под старую версию JRE, интегрирую его в jar-файл.
При запуске этого jar сначала запускается мой загрузчик. Он проверяет версию и в случае неудачи выводит окно с сообщением о необходимости загрузить новую версию. Иначе запускает приложение. Как это происходит.
Передаётся управление на загрузчик OneJar. Тот загружает основной проект.

Есть какие нибудь дополнения, вопросы?

Это сообщение отредактировал(а) Bodro - 20.3.2009, 13:32
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Bodro
Дата 20.3.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Всем спасибо! 
Вопрос решён! Тема закрыта!
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.