Игнорирование ошибок компиляции — Java

У меня есть около 1500 файлов для компиляции, в которых 15-20 файлов имеют ошибки компиляции. Эти файлы не находятся под моим контролем, поэтому я не могу их модифицировать/обновлять/удалять. Итак, у меня есть два вопроса здесь.

1) как мне игнорировать ошибки компиляции из этих 15-20 файлов и продолжать создавать файл .class для остальных из них. есть ли какой-либо параметр командной строки javac или что-либо, что будет игнорировать ошибки компиляции и создавать файлы .class для всех других файлов без ошибок.

2) компилятор java прервет компиляцию, как только увидит эти ошибки, или продолжит компиляцию (создание файлов .class) всего остального и в конце будет жаловаться на эти файлы с ошибками.


person ajay    schedule 28.09.2011    source источник
comment
Возможный ответ для вас: stackoverflow .com/questions/17920920/   -  person ABC123    schedule 14.01.2016


Ответы (7)


Вы можете использовать Eclipse. Его внутренний компилятор — по крайней мере, в некоторых случаях — способен продолжать работу с остальной частью сборки, даже если некоторые классы не компилируются полностью. Он даже будет создавать файлы классов для сломанных классов, если это возможно, генерируя методы, которые выдают исключение, как только они вызываются.

Я настоятельно рекомендую вам просто сделать копию всего исходного кода и как можно раньше исправить ошибки, по крайней мере, в вашей собственной копии, но частичная компиляция Eclipse может вам помочь .

person Jon Skeet    schedule 28.09.2011

Вы не можете игнорировать ошибки компиляции. Они всегда будут терпеть неудачу при сборке.

Единственный выбор — поговорить с тем, кто контролирует файлы, чтобы исправить их, или найти способ их замены.

Если вы попытаетесь удалить их из сборки, вам также придется удалить все файлы, которые используют эти файлы. Например

class A {
    B b;
}

Если B имеет ошибку компиляции, ваш скрипт сборки может пропустить B.java, но когда вы нажмете A.java, он все равно попытается скомпилировать B, поэтому A должен быть удален. Это может оказаться нетривиальной задачей.

person corsiKa    schedule 28.09.2011
comment
Привет Glowcoder, спасибо за быстрый ответ. Но создает ли он по крайней мере файлы .class для остальных файлов без ошибок? - person ajay; 29.09.2011
comment
Ну, допустим, у вас есть A, B и C. A и B выше. C ничего подобного нет. C должен получить файл .class, а A и B — нет. - person corsiKa; 29.09.2011

Вы можете сами написать скрипт, который проходит по вашему исходному дереву и вызывает javac для каждого java-файла отдельно. Таким образом, вы получите все файлы, скомпилированные правильно, которые не зависят от файлов с ошибками. Однако это будет ужасно медленная операция. Я ожидаю, что это займет в несколько 100 раз больше времени, чем один вызов javac (учитывая, что вы получите около 1500 вызовов).

person Markus A.    schedule 23.09.2012
comment
Любой комментарий о том, почему за это проголосовали? Этот подход отлично работает, и я на самом деле использую его в следующем сценарии: я использую javac, чтобы найти все зависимости кода моего проекта от функций в огромном каталоге библиотеки, который у меня есть. Затем я заставляю скрипт создать jar-файл только с теми классами, которые мне нужны, и без раздувания. Сценарий сначала пытается выполнить javac для всего проекта сразу, что не удается, если где-либо возникает ошибка. Затем, при необходимости, по умолчанию каждый файл в проекте компилируется отдельно. Результат: файл jar содержит все зависимости, которые мне нужны для безошибочного запуска частей моего проекта. - person Markus A.; 06.10.2012

Вы можете исключить определенные исходные файлы из компиляции с помощью тега exclude в задаче ant.

  <target name="compile" description="Compile Java source files">
    <javac destdir="classes" classpathref="classpath">
      <src path="src"/>
      <exclude name="**/excluded_folder/**"/>
    </javac>
  </target>

РЕДАКТИРОВАТЬ: Но, конечно, любые java-файлы, которые зависят от исключенных классов, также не смогут скомпилироваться, если у вас уже нет предварительно скомпилированной версии исключенных файлов в пути к классам.

person RHT    schedule 28.09.2011

Создавайте макеты файлов-нарушителей. В основном та же идея, что и в заголовочном файле C, включая сигнатуры функций и разумные возвращаемые значения по умолчанию (null, false, 0). Это позволит javac скомпилировать все, просто убедитесь, что фиктивные классы не включены в окончательный дистрибутив, иначе у вас будут странные ошибки, когда они окажутся первыми в пути к классам. Это также работает для реализации сломанных интерфейсов и наследования от сломанных классов.

person Perkins    schedule 15.03.2016

Что ты имеешь в виду

который будет игнорировать ошибки компиляции и создавать файлы .class для всех других файлов без ошибок.

Вы понимаете, что если эти файлы связаны (как будто в одном проекте), то зависимые исходные файлы тоже не будут компилироваться..? Нет никакого способа обойти это, кроме как исправить ошибки компиляции и повторить попытку!

person Bhaskar    schedule 28.09.2011
comment
в моем случае мне все равно, есть ли какие-либо зависимые файлы на этих - person ajay; 29.09.2011
comment
Вам может быть все равно, но компилятор Java заботится. Что вам нужно сделать, это: 1. Отделить файлы, которые имеют ошибки компиляции, и те файлы, которые зависят от этих файлов 2. Файлы, которые не имеют никаких зависимостей от каких-либо файлов, связанных с ошибками. Вы можете скомпилировать только вторую группу. - person Bhaskar; 29.09.2011

  1. Скажите тому, кто взломал код (дипломатически, конечно), исправить его как можно скорее. другие предложили (см. 2-й комментировать там), чтобы сделать эти вхождения общедоступными (внутри команды/компании), что значительно снижает количество таких ошибок компиляции
  2. Прокомментируйте все, что мешает компиляции кода (предполагается, что вам не нужны эти части)

Вы должны иметь дело не с компилирующим кодом, а с тем, кто его зафиксировал. Если над этим проектом работает больше людей, каждый должен иметь дело с той же проблемой на своем локальном компьютере (узнать, почему он не скомпилировался, отследить ошибочные классы, исключить/закомментировать эти классы если ваш код от них не зависит, пересоберите и т.д.) Гораздо эффективнее иметь только 1 человека для устранения проблемы, а все остальные просто обновляют свой локальный репозиторий.

person michael667    schedule 28.09.2011
comment
-1 Обвинить не получится. И еще он сказал, что там вроде 1500 файлов - person Carlos Valenzuela; 29.09.2011
comment
Приносим извинения, если слово blame здесь неуместно (англоязычный язык не является родным языком). Я отредактировал свой ответ (возможно, он был слишком коротким) - person michael667; 29.09.2011