LINUX.ORG.RU

[JAVA]а можно ли запихать бинарник в jar и стартовать его оттудаже?

 


0

0

привет всем,

следующия проблема:

есть 2 бинарника, один для Линукса другой для оффтопа:

можно ли запихать их обойх в jar , когда jar стартует ( а точнеежава класс из него) то в зависимости от платформы запускается то одно то другое? если да то куда мне копать чёт гугл ничего толкового не выдал.

пасибо

★★

Честно говоря, никогда не пробовал так делать.

Попробуй посмотри на java.lang.Runtime. До бинарника в jar-файле можно достучаться с помощью метода getResource() из класса Class. Объект типа Class есть в объекте любого типа.

Ian ★★
()

Кто такой "бинарник"? Это дллка-сошка? Тогда ответ "нет". Без специальных ухищрений нельзя. Т.е. теоретически жабский код может взять getResource(), попробовать его выложить в место, соотв. System.getProperty("java.library.path") - но скорее всего обломится, оно окажется ридонли. А жабский загрузчик бинарного кода по архивам лазать не умеет ЕМНИП.

ЗЫ Ну можно еще жабку начать патчить, но это совсем другая история.

svu ★★★★★
()

Из jar штатными средствами Java читается что угодно, как из простой файловой системы.

В JBForth у себя так при старте Форт-часть системы компилирую. В jar'е это просто кучка *.f файлов.

586	    public String readTextFromJar(String fileName)
587	    {
588	        // System.out.println("Try load jar "+fileName);
589	
590	        String thisLine;
591	        StringBuffer ret = new StringBuffer();
592	
593	        java.io.InputStream is = getClass().getResourceAsStream(fileName);
594	
595	        if(is == null)
596	            return null;
597	
598	        BufferedReader br = new BufferedReader(new InputStreamReader(is));
599	
600	        try
601	        {
602	            while(br != null && (thisLine = br.readLine()) != null)
603	                ret.append(thisLine + "\n");
604	        } catch(Exception e)
605	        {
606	            e.printStackTrace();
607	        }
608	
609	        return ret.toString();
610	    }

KRoN73 ★★★★★
()
Ответ на: комментарий от svu

Ну так прочитать, сохранить в /tmp или %TEMP% в зависимости от системы и загрузить. Или jni не позволяет прочесть .dll/.so из любого места?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

ЕМНИП, jni не позволяет (кстати, это даже секурно). Только то, что лежит в readonly system property java.library.path - а там уж как повезет, разрешать писать в эти каталоги или нет...

svu ★★★★★
()
Ответ на: комментарий от svu

>Только то, что лежит в readonly system property java.library.path

Библиотеки придется распаковать из jar куда нибудь в /tmp например или аналогичную директорию или в текущую. Загружать их можно из любой директории: System.load(/full/path/to/library);

Lucky1 ★★★
()
Ответ на: комментарий от Lucky1

> Загружать их можно из любой директории: System.load(/full/path/to/library);
Гхм. Так я не пробовал. А вот интересно - как с этим соотносится тот факт, что в унихе System.load('foobar') грузит libfoobar.so? Там траблов не возникнет с неявно добавляемым префиксом?

svu ★★★★★
()
Ответ на: комментарий от wfrr

Точно рабочий? На линухе проверяли?

http://java.sun.com/javase/6/docs/api/java/lang/System.html#loadLibrary(java....

The manner in which a library name is mapped to the actual system library is system dependent.

Да, там выше есть метод load - вот он действительно принимает полный путь...

svu ★★★★★
()
Ответ на: комментарий от svu

Я его вообще не проверял, но автор написал же "This works", а я хоть с явой и общаюсь но не так глубоко 8)

wfrr ★★☆
()

Господа, а с чего вы все решили, что это библиотека, а не исполняемый файл? Как-то слово "запускается" в обиходе не очень коррелирует с библиотекой.

IMHO, товарищу нужно что-то вроде exec.

Ian ★★
()
Ответ на: комментарий от Ian

драсте всем, извините что долго не отвечал, не мог добраться до нета,

и так: мне нужно действительно запустить исполняймый файл, то и есть например в виндовсе это blabla.exe

что я хотел, мы имеем jar файл, в нём сам класс ну итп, и тудаже мы кидаем наш файл. вот его и надо распаковать и запустить.

товарищ KRoN73 предложил как по мне довольно рабочую идею, я ещё её не проверял, но седня или в крайнем случаее завтра попробую, то и есть просто распаковать наш файл из архива и запустить его.

всем большое спасибо =))

ещё раз очень благодарен =)

djung ★★
() автор топика
Ответ на: комментарий от Ian

>IMHO, товарищу нужно что-то вроде exec.

именно!

djung ★★
() автор топика
Ответ на: комментарий от djung

молодец что долго не отвечал. много интересного понаписали. :)

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.