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


Автор: hatalsky 12.12.2010, 00:40
есть такая структура каталогов
Код

/home/username/java
------------------------------+/src
------------------------------------+/gui
------------------------------------------hello.java
------------------------------+/bin
------------------------------------+/gui
------------------------------------------hello.class

файл hello.java начинается со строки
Код

package gui;

и есть две переменные среды
Код

export CLASSPATH=/home/username/java/bin/
export SRCPATH=/home/username/java/src/

переходим в каталог с исходниками
Код

cd ~/java/src

компилируем приложение так
Код

javac -d $CLASSPATH ./gui/hello.java

получаем .class файл там где нужно, исполняем так(из любого каталога исполняется)
Код

java gui.hello

всё работает, а теперь внимание, вопрос
я хочу компилировать файл так же как и исполнять из любого каталого, man javac говорит что для этого есть аргумент -sourcespath, но следующая команда нифига не помогает
делаем сразу cd / что бы проверить в реальных условиях, а потом компилируем так
Код

javac -d $CLASSPATH -sourcespath $SRCPATH gui/hello.java

и видим
Код

javac: file not found: gui/hello.java
Usage: javac <options> <source files>
use -help for a list of possible options

видимо я неправильный параметр указываю в -sourcepath но увы нигде не могу найти как это сделать правильно(
может кто-то подскажет решение моей проблемы?

Автор: dobrolub 12.12.2010, 08:07
параметер -sourcepath синонимичен параметру -classpath - он используется для того, чтобы указать компилятору где искать зависимости. Допустим, что ты компилируешь класс qa.Test, который зависит от qa.AbstractTest.

qa.AbstractTest в директории /tmp/abstract
qa.Test в директории /tmp/test

Для того чтобы скомпилировать класс qa.Test надо компилятору указать где поискать исходники зависимостей (в данном случае  - qa.AbstractTest) 

и комманда для компиляции qa.Test будет выглядеть следующим образом.

tmp $ javac -sourcepath abstract qa/Test.java

javac будет комилить qa/Test.java, а когда ему понадобиться найти класс qa.AbstractTest он поищет его в директории /tmp/abstract и скомпилит его тоже.

Я там случайно на минус звездочки надавил (хотел посмотреть как работает, но обратно вернуть не удалось). Извини.


Автор: mstalker26 12.12.2010, 11:50
Отличная статья, связанная с SOURCEPATH и CLASSPATH. Так сказать факультативный материал  smile .
http://www.ibm.com/developerworks/ru/library/j-classpath-unix/

P.S. По поводу твоей строчки, разве не должно быть
Код

javac -d $CLASSPATH -sourcespath $SRCPATH /home/username/java/src/gui/hello.java


P.P.S. Названия классов пишут с большой буквы  smile 

Автор: hatalsky 12.12.2010, 13:57
dobrolub, за статью спасибо, но я её уже видел(благодаря ей с classpath разобрался, а вот sourcepath не осилил).
Как работает sourcepath теперь понял, но интересно, а так, как я хотел(компилировать из любого места не прописывая путей к исходникам) это вообще возможно?

mstalker26 В вашем случае вы прописываете полный путь к исходникам, чего я как раз и хотел избежать разбираясь с sourcepath.
P.S: Вы немного не точно указали путь к исходнику: ~/java/src/gui/hello.java, поправьте, мб кому-нить пригодится эта информация, а тут будет ошибка(

P.P.S: И ещё вопросик: а будет ли javac брать sourcepath из какой-нить переменной среды, как она это делает в случае с classpath, и если будет, то из какой?

Автор: dobrolub 12.12.2010, 21:39
Да, компилить можно из любого места прописывая путь к исходникам. Путь может быть как абсолютным /tmp/x/y/z/Z.java  так и относительным к текущему каталогу.

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