Несовместимый NoClassDefFoundError в заданной Java-задаче - PullRequest
0 голосов
/ 23 апреля 2010

Мой скрипт сборки ant запускается с задачи Java, которая использует fork = true

<java fork="true"
  classname="org.apache.tools.ant.launch.Launcher"
  jvm="${java.home}/bin/java"
  classpathref="class.path">
  <arg value="-f" />
  <arg value="${ant.file}" />
  <arg value="generate" />
</java>

<arg value="generate" /> указывает на другую задачу в том же файле сборки муравья. Эта задача запускает другую цель с дополнительной задачей, которая указывает на другой файл.

<subant verbose="true" target="replace">
  <fileset dir="${basedir}" includes="refactor.xml" />
</subant>

Этот файл refactor.xml снова запускает задачу java с fork = true.

<java classpathref="class.path"
  classname="namespace.Tool"
  fork="true"/>

Странное поведение: все работает нормально, кроме того, что время от времени я получаю ошибку NoClassDefFoundError для исходного файла namespace.Tool java. После, например, закрытие, повторное открытие файла, ошибка может исчезнуть, однако нет воспроизводимого поведения.

Я пытался избегать конструкции subant (раньше не загромождал), но это не помогло.

Наконец, class.path, на который ссылаются, выглядит так:

<path id="class.path">
  <pathelement location="../common/bin" />
  <pathelement location="./bin" />
  <fileset dir="${build.dir}">
    <include name="...jar" />
  </fileset>
</path>

Есть идеи?

1 Ответ

0 голосов
/ 27 мая 2010

Причина была <pathelement location="./bin" />.

Эта папка bin была перекомпилирована Eclipse, как только на других шагах в последовательности задач Ant, например, папка была удалена. Настройка по умолчанию в Eclipse - перекомпилировать весь код в такой момент.

В результате процесс Ant может найти или не найти определенный класс в этой папке bin, что приведет к несогласованности NoClassDefFoundError.

...