1

начнем с джавы..
нашел два способа компилить джаву....
1) jar -cvf -o <output_file> <source>.java
может я что то делаю тут не так, но ДЖАР файл у меня создается но не запускается... можно сказать он пуст...
и єто не единственая проблема... команда jar не выдает никаких логов... тоесть есть ли там ошибка или ворнинг ему пофиг... он всеравно создаст джар-файл....
2) javac Main.java - компилиция в файл class
java Main - запуск скомпилированого КЛАС-файла...
здесь сначала было все норм... компилил и запускал.... вот только пролема когда хочеш запустить КЛАС файл указывая полный путь к нему....
например
javac /home/name/project/Main.java - все пучком, КЛАСС-файл создался....
но теперь проблема с запуском
java /home/name/project/Main - по идее нужно запускать так(потому как указівать явно разширение запрещает), Но оно я так понимаю видит не файл Маin.class а просто папку МЕЙН.. и конечно же відает ошибку... указывать полный путь мне надо.. так как пишу некую програмку.. если это вайжно то скажу что пишу на джаве.. использую getRuntime().exec(...);
слішал что есть такой компиль как gcj... я им попробовал скомпилить... но те файлы которые из-под него вышли у меня не запустились... знаю под виндой он используется для превращения джава кода в ЕХЕ.. короче я не знаю будед ли он мне нужен в линуксе...(или я ошибаюсь)

теперь маленькая проблема з С++
ее я компилю через утилиту gcc... но вот только она не знает почти никаких библиотек которіе подключены в коде... ели не сложно подскажите как подключить эти библиотеки и главное ГДЕ ОНИ НАХОДЯТСЯ...?

2

маленькая поправочка...
для с++ я использую g++

3

з с++ проблема решена.. я там немного ступил... все коми=пилит нормально

4

lion69 пишет:

начнем с джавы..
нашел два способа компилить джаву....
1) jar -cvf -o <output_file> <source>.java
может я что то делаю тут не так, но ДЖАР файл у меня создается но не запускается... можно сказать он пуст...
и єто не единственая проблема... команда jar не выдает никаких логов... тоесть есть ли там ошибка или ворнинг ему пофиг... он всеравно создаст джар-файл....

ag  Это НЕ компилирование. Это - архивирование.

lion69 пишет:

2) javac Main.java - компилиция в файл class
java Main - запуск скомпилированого КЛАС-файла...
здесь сначала было все норм... компилил и запускал.... вот только пролема когда хочеш запустить КЛАС файл указывая полный путь к нему....
например
javac /home/name/project/Main.java - все пучком, КЛАСС-файл создался....
но теперь проблема с запуском
java /home/name/project/Main - по идее нужно запускать так(потому как указівать явно разширение запрещает), Но оно я так понимаю видит не файл Маin.class а просто папку МЕЙН.. и конечно же відает ошибку... указывать полный путь мне надо.. так как пишу некую програмку.. если это вайжно то скажу что пишу на джаве.. использую getRuntime().exec(...);
слішал что есть такой компиль как gcj... я им попробовал скомпилить... но те файлы которые из-под него вышли у меня не запустились... знаю под виндой он используется для превращения джава кода в ЕХЕ.. короче я не знаю будед ли он мне нужен в линуксе...(или я ошибаюсь)

Если нужно срочно - ищи в инете все связанное с пакетами и CLASSPATH. Или подожди, я мануал небольшой накидаю. Только у меня сейчас по плану ужин, чай, курить. Как говорится война войной... wink

5

я подожду...)

6

lion69,
А не проще поставить какой-либо IDE типа Eclipse и не мучиться?

7

Hvzh,
нет... код джавы я и так пишу в IDE(вот только не знаю чем так всем нравится еклипс... по моему он более глючній чем нетбинс (имхо  конечно))...
и я сос воего кода через функции линукса компилю код...(не спрашивайте зачем... )

8

lion69,
Тогда прав mycetophylax, читайте про пакеты и CLASSPATH

9

я вот нашет команду gcj - и думаю ее использовать

10 (28.11.2010 22:36:31 отредактировано mycetophylax)

lion69 пишет:

java /home/name/project/Main - по идее нужно запускать так(потому как указівать явно разширение запрещает), Но оно я так понимаю видит не файл Маin.class

Все дело в том, что ищется не файл Main.class, а класс Main.
Поиском классов занимаются загрузчики классов (ClassLoaders). Всего их три штуки (это не совсем верно, т.к. на самом деле можно написать свой собственный загрузчик, но чтобы сильно не усложнять и не забивать мозги пока не нужными сведениями про них я больше ничего писать не буду):
     1. Bootstrap classloader - базовый загрузчик (обычно переводят так).
     2. Extension classloader - загрузчик расширений.
     3. Application classloader (часто называют system classloader, но мне почему-то больше нравится первый вариант, т.к. он "загружает приложения" wink).

Bootstrap classloader ищет и загружает "стандартные" классы (приведу несколько для примера: System, Double, JFrame и т.д.) из /jre/lib. Extension classloader ищет классы расширений в jre/lib/ext.
И, наконец, интересующий нас в данный момент Application classloader. Он ищет классы там, куда указывает переменная CLASSPATH. Т.е. именно он загружает написанные тобой классы. По умолчанию CLASSPATH=".", т.е. текущая директория. Поэтому запуск

java /home/name/project/Main

и выдает ошибку

Exception in thread "main" java.lang.NoClassDefFoundError: /home/name/project/Main (wrong name: Main)

Для того, чтобы указать, где искать классы можно установить значение переменной CLASSPATH

export CLASSPATH=/home/name/project

А после этого спокойно запускать

java Main

Или передать параметр при запуске:

java -classpath /home/name/project Main
короткая запись
java -cp /home/name/project Main

P.S. Сработает, только если твой класс находится в пакете по-умолчанию. Про пакеты скоро будет.

lion69 пишет:

я вот нашет команду gcj - и думаю ее использовать

Не стоит. Используй sunовскую java.

11 (28.11.2010 23:13:12 отредактировано lion69)

а почему вы против gcj?
она вроде даже быстрее мне показалась

и еще вопрос... а если я захочу запусти одновременно в потоке компиляцию и запуск двох файлов... тогдна classpath может установить не ту что нада директорию...

в g++ можно через (-о) указать директорию куда будет помещет скомпиленій файл.... а есть что то такое в javac?

12

Для плавного перехода к пакетам цитирую себя

mycetophylax пишет:

...приведу несколько для примера: System, Double, JFrame и т.д...

Вообще-то правильнее было написать вот так:

...приведу несколько для примера: java.lang.System, java.lang.Double, javax.swing.JFrame и т.д..

Запись вида "java.lang.System" означает класс System из пакета java.lang. Грубо говоря, пакет - это набор классов. В основном пакеты используются для устранения конфликта имен, например, если несколько программистов назовут свои классы одинаково - "Main".

Чтобы поместить класс в пакет, необходимо в первой строке написать:

package ru.linuxforum.lion69;

Если такой строчки в файле нет, то считается, что класс находится в пакете по умолчанию
Sun рекомендуют для названия пакетов использовать доменное имя записанное наоборот.

Для примера напишу простейший класс Main (название оставлю твое).

package ru.linuxforum.lion69;

public class Main{
    public static void main(String[] args){
        System.out.println("Всем привет!!!");
    }
}

Это файл нужно обязательно поместить в ru/linuxforum/lion69, т.е. в подкаталог, путь к которому совпадает с названием пакета:

ru.linuxforum.lion69
ru/linuxforum/lion69

Т.е. если раньше твой файл лежал тут

/home/name/project/Main.java

то после включения его в пакет, он должен располагаться так:

/home/name/project/ru/linuxforum/lion69/Main.java

Теперь для компиляции выполняется следующая команда, если текущим является каталог, в котором лежит Main.java (/home/name/project/ru/linuxforum/lion69):

javac -cp /home/name/project Main.java

Да-да, именно так wink. Компилятору тоже нужно указывать CLASSPATH, хотя в данном примере в этом нет необходимости. Но чем раньше приучишь себя к этому, тем лучше и легче будет в будущем.

Запуск

java -cp /home/name/project ru.linuxforum.lion69.Main

Теперь необходимо передавать полное имя класса, вместе с пакетом.

P.S. Ты еще не передумал компилировать все "ручками?"  ag

13 (28.11.2010 23:54:33 отредактировано mycetophylax)

lion69 пишет:

в g++ можно через (-о) указать директорию куда будет помещет скомпиленій файл.... а есть что то такое в javac?

Ага. Используй -d /путь/к/папке

javac -cp /home/name/project -d /home/name/project/classes Main

Но тогда и запускать придется уже так

java -cp /home/name/project/classes ru.linuxforum.lion69.Main

14

мдам.... мне очень редко кто так класно все обьясняет.....
большое списибо....
и еще маленький вопрос.....
jar -cvf Main.jar .*class
так упаковывать можно?

15

lion69 пишет:

мдам.... мне очень редко кто так класно все обьясняет.....
большое списибо....
и еще маленький вопрос.....
jar -cvf Main.jar .*class
так упаковывать можно?

Про JAR тоже отдельный большой вопрос. Мне через 5 часов на работу идти, спать надо. Так что только завтра после 18.00 московского времени.  wink

16 (29.11.2010 00:07:08 отредактировано lion69)

ок....
и еще

а если я захочу запустить одновременно в потоке компиляцию и запуск двох файлов... тогдна classpath может установить не ту что нада директорию...  я прав?

17

пишу на джаве.....
на ней пишу уже достаточно долго....
но только сейчас заметил что в методе getRuntime().exec() можно задавать директорию.....
ваш мануал меня на это натолкнул)

18

lion69 пишет:

пишу на джаве.....
на ней пишу уже достаточно долго....

Странно... Писали долго и до сих пор не слышали про CLASSPATH и packages?

19

lion69 пишет:

и еще маленький вопрос.....
jar -cvf Main.jar .*class
так упаковывать можно?

Можно. Только опять же, если классы не входят ни в какой пакет. Если классы в пакете, то нужно упаковывать каталог:

jar cvf Main.jar ru   //если текущим является /home/name/project/classes, и в котором находится ru/linuxforum/lion69
jar cvf Main.jar /home/name/project/classes/ru    //если использовать абсолютный путь

Внутри архива создается каталог META-INF с файлом MANIFEST.MF
По умолчанию он выглядит так:

Manifest-Version: 1.0
Created-By: 1.6.0_22 (Sun Microsystems Inc.)

Одно из самых интересных "фич" - можно указать в нем параметр Main-Class, для этого создаешь файл MyManifest.mf

Manifest-Version: 1.0
Created-By: 1.6.0_22 (Sun Microsystems Inc.)
Main-Class: ru.linuxforum.lion69.Main

В конце файла обязательно должна быть пустая строка.
Для того, чтобы подсунуть его в jar архив:

jar cvfm Main.jar  MyManifest.mf /home/name/project/classes/ru

И теперь программу можно будет запускать так:

java -jar Main.jar
lion69 пишет:

а если я захочу запустить одновременно в потоке компиляцию и запуск двох файлов... тогдна classpath может установить не ту что нада директорию...  я прав?

Можно ведь запускать с параметром -cp

java -cp /home/name/project/classes ru.linuxforum.lion69.Main

Или если через export, то вот так

export CLASSPATH= $CLASSPATH:/home/name/project/classes

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

20

спасибо