| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Javac -classpath + ant |
| Автор: chief39 19.3.2007, 17:22 | ||||||||||||||
| ! Тему закинул не в тулзы, так как вопрос большей частью по банальному класспасу и javac День добрый("добрый" - это я из вежливости... Вот уж не думал никогда, что в такое упрусь.... Суть какова... Есть каталоги, которые лежат рядом. В каждом из них - структура пэкэджей. Некоторые классы используют классы из соседних папок. И во время компиляции возникают порблемы... Выкладываю свой тестовый пример, который завёл через 5 минут после траблы... files - рут папка, тут всё лежит в ней папка work с модулями и билд скрипт. То есть dir1 и dir2 - это логические модули как бы. В них есть свои структуры пэкэджей, которые, всё-таки, иногда пересекаются в плане использования друг друга. xxx и yyy, соответственно, пэкэджи. files |- build.xml |- work |- dir1 | |- xxx | |- My.java | |- dir2 |- yyy |- sub | |- Util.java |- His.java В файлах .java содержится лажа вроде
И только в My.java:
То есть мы подключаем и используем класс His из другого пэкеджа, а также из другого модуля Далее начинаются чудеса(по крайней мере мне пока так кажется): Первый вариант:
Выполняет всё на ура. "Всё", это:
тупо не пашет - грит:
(не часто так запускаю, очевидно туплю...) Теперь третье, ant: build.xml:
Запускаю ant -v compile Пардон, приведу полностью во избежание вопросов:
dir2 в класспасе наличествует!!! Но пэкедж yyy упорно невидим :( Запускаю предварительно ant compile2 - компилю пэкедж yyy. То есть, делаю His.class явно Запускаю опять ant -v compile. Пишет ту же полезную инфу... за маленьким исключением: пэкедж он видит, ни капли не ругается, вуаля! - My.class готов. P.S. Все описанные действия проделал в данном порядке с точностью "до запятой" Вопрос: как включить .java файлы в класспас и заставить компилер ВИДЕТЬ их? (В анте) Как объяснить все вышеописанные нюансы? (Факуалы что-то не особо разжовывают :( ) |
| Автор: LSD 19.3.2007, 17:43 | ||
|
| Автор: chief39 19.3.2007, 18:02 |
| Тут есть нюанс.. :( О котором я ещё не говорил В текущем проектовом скрипте именно так всё и делается. Если просто запустить compile - будет всё Ок (!)Но, если использовать аргумент destdir, то в эту папку будут складываться классфайлы не только из dir1, но и используемые из dir2 При таких раскладах у нас мусор в соседних модулях. Как раз я и хотел перенести эти зависимые импорты из sourcepath в classpath... Видится один хреновый вариант: Прогонять компиляцию всех модулей проекта без дестдира, включая зависимости в sourcepath а потом... Прогонять повторно компиляцию всех модулей проекта с дестдиром, включая зависимости уже как classpath. |
| Автор: LSD 19.3.2007, 19:27 |
| Дело в том, что javac, не может работать с исходниками, если каласс А зависит от класса Б, то для компиляции класса А, класс Б должен в обязательном порядке присутсвовать в CLASSPATH. Если все исходники лежат в одной директории, то они просто компилируются в определенном порядке. А что, между модулями есть перекрестные зависимости? |
| Автор: LSD 19.3.2007, 23:44 | ||||||
Вот что у меня получилос, создаем каталоги src1, src2, classes. В src1 кладем A.java
В src2 кладем B.java
В корне создаем такой build.xml
Запускаем компиляцию и в classes получаем A.class и B.class. А если у класса B убрать extends A, то получим только B.class. Так что похоже, что раздельная компиляция невозможна, class-файлы все равно нужны компилятору. |
| Автор: chief39 20.3.2007, 14:13 | ||||
Используя
без destdir="${build.dir}" Получаем скомпиленности по своим местам, но, компилятся ВСЕ классы в данных модулях Используя
Получаем скомпиленности по своим местам, но, в модуле dir2 компилятся только классы, от коотрых зависят классы из dir1 Сейчас пытаюсь перетряхнуть огромную скриптяру.... ЗЫ: Всем здравым людям на будущее: Пишите код, думая о том, кто его будет расширять/переделывать! Потому что иногда проще выбросить имеющийся "хлам" и переписать !!! |
| Автор: LSD 20.3.2007, 14:43 |
| А вообще нафига нужно исходники и скомпиленые классы држать в одной и той же папке? Что за моветон? |
| Автор: chief39 20.3.2007, 15:12 | ||
Это на этапе предварительной компиляции. Потому что потом все депенденси можно подключить уже как classpath, а не sourcepath и назначить destdir куда пойдут только классы текущего модуля без классов депенденсис(читай мусора). Вот такой изврат.... Временный. Когда решим вопрос разделения сырцов и выделения API - перепишу нафик всё. Но сейчас время жмёт и перетряхивать ВСЕ сырцы(а их дофига), перекидывать сотни классов из папки в папку, не забывая всё это тестить, из-за одной-трёх зависимостей будет нерентабельно. Через пару недель, думаю начну переделку заново. По уму. |
| Автор: chief39 20.3.2007, 15:55 |
| Это пипец... не знаю чем и как я умудрилсо... В одном модуле тупо перестало видеть соседние классы.... я просто сполз под стол от такого "подарка".... А перед этим переставил фар - все файлы отображались ловеркэйс. Настроил фар - и случайно уткнулся в то, что в этом модуле все названия файлов .java нонче ловеркэйс. Хорошо что заметил и переапдейтился.... Блин, это рок какой-то... ПЫСЫ: Это крик души, а не оффтоп |
| Автор: chief39 20.3.2007, 17:11 | ||||
| Ещё один нюанс "втыкнул" в скрипт: Делаю по принципу
Но, поскольку модули кросс-зависимы и собираются по очереди, возникает иногда такая лажа: Есть модуль dir1, в нём класс X, сей класс использует класс Y из модуля dir2 При сборке dir1 срабатывает депенденси соурспас и Y.class появляется в модуле dir2 рядом со своим исходником. При сборке модуля dir2 класс Y используется "своими" классами, к примеру Z(в этом же модуле). Но, так как он есть и в сорцах и в байткоде рядышком - компилер его просто "не находит". Ввёл чистку .class файлов в текущем пакете перед его сборкой... Копаю "прелести" такого изврата далее. |
| Автор: chief39 20.3.2007, 18:28 |
| Вышло. Как и задумывал Теперь погоняем, потестим, уберём "эхи" - и пока будем сбирать так, через попу. Пока дописал - подумалось... чем переписывать и подчищать изуродованный скрипт в несколько тысяч строк... Лучше его упростить и переписать. Причём... наверное(всё равно с нуля) - на мавене. Уже давно подумывали, а тут самое оно Как пойдёт далее - расскажу Пока могу рассказывать только о соурспасах и класспасах |