понедельник, 22 марта 2010 г.

Ant Magic

Совсем недавно на проекте столкнулись с забавным поведением компиляции из анта. Решил описать, так как по моему это некорректное поведение анта. Вот так выглядит проект:
Код простой. Класс 1 вызывает метод класса 2.
  1. import test.sub2.Sub2;  
  2.   
  3. public class Sub1 {  
  4.    
  5.  public static void sub1() {  
  6.   Sub2.sub2();  
  7.  }  
  8.    
  9. }  
  10.   
  11. package test.sub2;  
  12.   
  13. public class Sub2 {  
  14.  public static void sub2() {  
  15.  }  
  16. }  
Класс Sub2 из другого модуля и не должен компилироваться с основным. Класс 1 тоже не должен компилировать с основным, они оба из модуля 2, но лежат в разных пакетах и пакет Sub1 по случайности не был исключён из компиляции основного модуля 1. Т.о. ант скрипт выглядит вот так:
  1. <project name="TestProject" default="compile">  
  2.   
  3.  <target name="compile">  
  4.   <delete>  
  5.    <fileset dir="bin">  
  6.     <include name="**/*.class"/>  
  7.    </fileset>  
  8.   </delete>  
  9.   <javac srcdir="src" destdir="bin">  
  10.    <exclude name="test/sub2/**" />  
  11.   </javac>  
  12.  </target>  
  13.   
  14. </project>  
Чего я ожидал, что класс Sub2 не будет компилироваться, так как я его исключил и будет ошибка компиляции так как Sub1 пытается импортировать класс, которого нет в classpath.
Но не тут то было, его тоже скомпилирует и всё пройдёт саксес. Хорошо тут специально симулированный простой случай, но начинается полная (_!_) когда Sub2 вызывает ещё какой-то класс, в котором есть специфические методы из библиотек, которых нет в classpath модуля1 и соответственно это умный ант разрулить не может. И человек рвёт на себе волосы, потому что по сути он всё сделал правильно, модуль 2 компилируется без проблем, какого падает компиляция модуля 1, хотя в его классах не было изменений, не понятно. Вообщем вот он какой magic.

Комментариев нет:

Отправить комментарий