![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| chief39 |
|
||||||||||||||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
! Тему закинул не в тулзы, так как вопрос большей частью по банальному класспасу и 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 файлы в класспас и заставить компилер ВИДЕТЬ их? (В анте) Как объяснить все вышеописанные нюансы? (Факуалы что-то не особо разжовывают :( ) Это сообщение отредактировал(а) chief39 - 19.3.2007, 17:32 -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
||||||||||||||
|
|||||||||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Тут есть нюанс.. :( О котором я ещё не говорил
В текущем проектовом скрипте именно так всё и делается. Если просто запустить compile - будет всё Ок (!)Но, если использовать аргумент destdir, то в эту папку будут складываться классфайлы не только из dir1, но и используемые из dir2 При таких раскладах у нас мусор в соседних модулях. Как раз я и хотел перенести эти зависимые импорты из sourcepath в classpath... Видится один хреновый вариант: Прогонять компиляцию всех модулей проекта без дестдира, включая зависимости в sourcepath а потом... Прогонять повторно компиляцию всех модулей проекта с дестдиром, включая зависимости уже как classpath. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Дело в том, что javac, не может работать с исходниками, если каласс А зависит от класса Б, то для компиляции класса А, класс Б должен в обязательном порядке присутсвовать в CLASSPATH. Если все исходники лежат в одной директории, то они просто компилируются в определенном порядке.
А что, между модулями есть перекрестные зависимости? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Да, но в случае с подключением в класспас папок с неоткомпиленными классами он всё-таки проверяет откомпилены ли они и предсоздаёт их...(первый пример) Правда, эта фича в каком-то случае отключается... почему? - хз. Ага. Всё гораздо хуже, подробные размеры траблы опишу позже, сейчас лихорадочно ищу решение. Пока стараюсь подогнать к временному варианту: Компилять всё, включая все зависимости в соурспас, но без дестдира. После этого повторная компиляция с дестдиром и уже класспасом вместо соурспаса для зависимостей жёпа. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Вот что у меня получилос, создаем каталоги src1, src2, classes. В src1 кладем A.java
В src2 кладем B.java
В корне создаем такой build.xml
Запускаем компиляцию и в classes получаем A.class и B.class. А если у класса B убрать extends A, то получим только B.class. Так что похоже, что раздельная компиляция невозможна, class-файлы все равно нужны компилятору. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||
|
|||||||
| chief39 |
|
||||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Используя
без destdir="${build.dir}" Получаем скомпиленности по своим местам, но, компилятся ВСЕ классы в данных модулях Используя
Получаем скомпиленности по своим местам, но, в модуле dir2 компилятся только классы, от коотрых зависят классы из dir1 Сейчас пытаюсь перетряхнуть огромную скриптяру.... ЗЫ: Всем здравым людям на будущее: Пишите код, думая о том, кто его будет расширять/переделывать! Потому что иногда проще выбросить имеющийся "хлам" и переписать !!! -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А вообще нафига нужно исходники и скомпиленые классы држать в одной и той же папке? Что за моветон?
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Это на этапе предварительной компиляции. Потому что потом все депенденси можно подключить уже как classpath, а не sourcepath и назначить destdir куда пойдут только классы текущего модуля без классов депенденсис(читай мусора). Вот такой изврат.... Временный. Когда решим вопрос разделения сырцов и выделения API - перепишу нафик всё. Но сейчас время жмёт и перетряхивать ВСЕ сырцы(а их дофига), перекидывать сотни классов из папки в папку, не забывая всё это тестить, из-за одной-трёх зависимостей будет нерентабельно. Через пару недель, думаю начну переделку заново. По уму. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Это пипец... не знаю чем и как я умудрилсо...
В одном модуле тупо перестало видеть соседние классы.... я просто сполз под стол от такого "подарка".... А перед этим переставил фар - все файлы отображались ловеркэйс. Настроил фар - и случайно уткнулся в то, что в этом модуле все названия файлов .java нонче ловеркэйс. Хорошо что заметил и переапдейтился.... Блин, это рок какой-то... ПЫСЫ: Это крик души, а не оффтоп Это сообщение отредактировал(а) chief39 - 20.3.2007, 15:56 -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Ещё один нюанс "втыкнул" в скрипт:
Делаю по принципу Но, поскольку модули кросс-зависимы и собираются по очереди, возникает иногда такая лажа: Есть модуль dir1, в нём класс X, сей класс использует класс Y из модуля dir2 При сборке dir1 срабатывает депенденси соурспас и Y.class появляется в модуле dir2 рядом со своим исходником. При сборке модуля dir2 класс Y используется "своими" классами, к примеру Z(в этом же модуле). Но, так как он есть и в сорцах и в байткоде рядышком - компилер его просто "не находит". Ввёл чистку .class файлов в текущем пакете перед его сборкой... Копаю "прелести" такого изврата далее. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Вышло.
Как и задумывал Теперь погоняем, потестим, уберём "эхи" - и пока будем сбирать так, через попу. Пока дописал - подумалось... чем переписывать и подчищать изуродованный скрипт в несколько тысяч строк... Лучше его упростить и переписать. Причём... наверное(всё равно с нуля) - на мавене. Уже давно подумывали, а тут самое оно Как пойдёт далее - расскажу Пока могу рассказывать только о соурспасах и класспасах -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |