Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Файлы .jar


Автор: Shorr Kan 9.1.2004, 07:31
В \demo\jfc\ лежат файлы .jar. Они запускаются именно приложением. При компилировании же моего кода - создается файл .class. Правильно ли я понял, что вот эти мои .class только для консоли, а, если я хочу получить win-окно с приложением, то должен превратить свой .class в .jar? Если правильно, то как это сделать? Если нет, то что это за .jar такие?

Автор: Shorr Kan 9.1.2004, 08:12
Так, дополняю:

Собрал приложение, и получил-таки НЕ консольное окошко (но с без .jar. С ними так ничего и не понимаю). Вот приложение:


import java.awt.*;

public class win
{
public static void main(String args[])
{
MainFrameWnd frame = new MainFrameWnd("Win1");
frame.show();
}
}

class MainFrameWnd extends Frame
{
public MainFrameWnd(String sTitle)
{
super(sTitle);
}
}




Если же после строки
super(sTitle);
добавляю
setSize(400, 200);
То дает следующую ошибку:

Error:win.java(8):Method setSize(int, int) not found in class MainFrameWnd.


В чем тут дело?

Автор: SmaLL 9.1.2004, 08:55
Надо читать API-доку

Нет такого метода setSize(int x, int y)
Есть метод public void setSize(Dimension d)
Соответственно надо писать:
Цитата
this.setSize(new Dimension(400, 200));


Автор: Shorr Kan 9.1.2004, 11:23
И вот что выдает:

Error:win.java(17):Method setSize(java.awt.Dimension) not found in class MainFrameWnd.
Info : this.setSize(new Dimension(400, 200));

Автор: AntonSaburov 9.1.2004, 12:59
Можно посмотреть в http://forum.vingrad.ru/index.php?act=ST&f=9&t=12970 Вопрос: С чего начать, чтобы написать простое приложение для Swing

А вместо setSize использовать setBounds(100,100,200,200)

Автор: DarkDS 9.1.2004, 13:42
Цитата(Shorr @ 9.1.2004, 07:31)
В \demo\jfc\ лежат файлы .jar. Они запускаются именно приложением. При компилировании же моего кода - создается файл .class. Правильно ли я понял, что вот эти мои .class только для консоли, а, если я хочу получить win-окно с приложением, то должен превратить свой .class в .jar? Если правильно, то как это сделать? Если нет, то что это за .jar такие?

jar файл это архив класс файлов.
То есть приложение запускатся может как из jar файлов так и просто из класс файловь. Преимушество jar файлов в том что
1. вместо россыпи файлов у тебя всего 1 файл.
2. jar файлы можно подписывать (для запуска приложений с повышенными правми в вебстарте нужны подписанные файлы)
3. можно задать майн класс (сокращает строку запуска)

по своей струкутре jar файл - обычный зип файл. Правда помимо класс файлов там еще лежит каталог MetaInf в котором находится Manifest.mf (описатель jar файла) и могут находится файлы подписи.
Майн класс прописывается в Manifest.mf.

Самый простой способ создать jar файл:
Создать test.jar и добавить в него test.class:
jar -cvf test.jar test.class

Создать test.jar и добавить в него все файлы и каталоги из каталога test:
jar -cvf test.jar -С test/

использование: jar {ctxu} [jar-file] [manifest-file] [-C dir] files ...

Опции для jar команды
-c Создать новый архив
-t показать содержимое архива
-x распакавать названный файл ( или все)из архива
-u изменить созданный архив
-v вывести статистику
-f задать имя архива
-m добавить созданный майнфест
Там есть еще пара, но это основыне.

Автор: Shorr Kan 10.1.2004, 06:56
Ой, получилось smile.gif Использовал метод resize(400, 200);
Но возник следующий вопрос... Новый топик smile.gif

Автор: Shorr Kan 3.2.2004, 03:19
Не получается создать jar-архив.

C:\j2sdk1.4.2_03\bin>javac StartApp.java

C:\j2sdk1.4.2_03\bin>java StartApp


Тут все работает. Далее:

C:\j2sdk1.4.2_03\bin>jar cvf svm.jar StartApp.class
added manifest
adding: StartApp.class(in = 845) (out= 559)(deflated 33%)


И теперь, после запуска svm.jar, выдает ошибку:

Failed to load Main-Class manfest attribute from C:\j2sdk1.4.2_03\bin\svm.jar

Что такое?

Автор: AntonSaburov 3.2.2004, 14:28
Цитата
И теперь, после запуска svm.jar, выдает ошибку:

А строчку запуска можешь показать ?
А лучше всю последовательность действий расписать подробнее.
Да и в архив лучше все-таки пакет класть. А у тебя класс верхнего уровня - с ним всегда какие-то заморочки, если есть jar.

Автор: Гость_Shorr Kan 4.2.2004, 05:46
Строчку запуска? А просто два клика на .jar ... Остальные-то ведь так работают. Я думал, что и мой должен бы...

Последовательность:

Архивирую в .jar рабочий .class . Он превращается в такой вот нерабочий .jar ... Подробнее некуда, честно говоря.

Что значит "пакет класть"?

Автор: AntonSaburov 4.2.2004, 11:03
Цитата
Строчку запуска? А просто два клика на .jar ... Остальные-то ведь так работают. Я думал, что и мой должен бы...

Для того, чтобы запустить jar в нем есть такой каталог - META-INF.
В нем есть файл - MANIFEST.MF.
И вот если его посмотреть, то там должен быть написано Main-Class:<имя класса>
И вот если это тот класс, который нужно, то по и дее должно все запускаться. Если же нет там такого - то само собой ничего не запустится.

Видимо еще один вопрос надо будет в FAQ положить smile.gif Но позже.

А сейчас главное - ты похоже пользуешься JBuilder или еще чем-то похожим. Так вот в JAR-файл кроме классов входит так называемый manifest - каталог META-INF, в котором находится файл MANIFEST.MF.
В этом файле хранится достаточно много полезной информации. В том числе может хранится имя класса, который имеет метод main и его надо запускать.

IDE обычно порождая такой jar записывают туда информацию о главном классе. А когда ты это делаешь ручками, то просто так это не получится - надо указывать все самому.

Для примера создадим простенькое приложение:
Код

public class MyClass
{
   public static void main(String[] args)
   {
       System.out.println("Hello, world!");
   }
}


Соберем его с помощью команды javac MyClass.java
Получим MyClass.class. Можно проверить его работоспособность запустив java MyClass

Теперь мы хотим всезапаковать в JAR. Для этого надо не просто его упаковать, но и указать класс, который будет главным и мы тогда сможем запускать наш jar командой такого плана java -jar <имя jar-файла>.

Для этого создадим обычный текстовый файл, например mf.txt, и запишем туда две строчки
Код

Manifest-Version: 1.0
Main-Class: MyClass


И вот теперь создадим jar-файл с указанием того, чтобы при создании манифеста использовалась информация из mf.txt. Вот эта команда

jar cvfm My.jar mf.txt MyClass.class

с - создать архив
v - показывать сообщения
f - создать арзив в файле
m - использовать текстовый файл для включения в манифест
My.jar - имя архива
mf.txt - имя файла с информацией для манифеста
MyClass.class - имя файла, включаемого в архив. Можно здесь использовать маску (*, ? и прочая)

И вот мы получили My.jar

Теперь для запуска мы можем использовать строку такого вида
java -jar My.jar

Вот и все.

Цитата
Что значит "пакет класть"?

Это значит, что класть в поддиректории. И все классы будут через точку - типа java.awt.*
Но это уже отдельная тема - давай ты задашь этот вопрос в еще одном топике. А то и так тема уже не соответствует.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)