Нужно ли перекомпилировать мое приложение при обновлении стороннего фляги? - PullRequest
2 голосов
/ 11 февраля 2009

У меня есть Java-приложение, которое использует сторонний API. JAR-файлы сторонних производителей меняются довольно часто из-за всевозможных исправлений, но сам API не так часто меняется.

Нужно ли перекомпилировать мое приложение каждый раз, когда меняется сторонний jar-файл?

Ответы [ 5 ]

8 голосов
/ 11 февраля 2009

Если API меняется, вам следует перекомпилировать, даже если вам не нужно вносить какие-либо изменения в ваш исходный код. Если API не изменился, вам не нужно перекомпилировать.

Причина, по которой «даже если вам не нужно вносить какие-либо изменения», заключается в том, что некоторые исходно-совместимые изменения могут быть двоично-совместимыми. Например, предположим, что вы сейчас звоните:

public void foo(String x)

и в более поздней версии это изменяется на:

public void foo(Object x)

Очевидно, что ваш код все равно будет компилироваться, но метод, который разрешает вызов, изменится.

Это, конечно, крайний случай. В принципе, если вы знаете, когда API меняется, у вас все будет в порядке.

5 голосов
/ 11 февраля 2009

Другой случай, когда перекомпиляция теоретически необходима, это константы. Значение константы буквально компилируется в байт-код классов, которые ее используют. Если значение изменяется в новой версии API, все, что скомпилировано со старой версией, будет продолжать использовать старое значение, что может привести к другому поведению и очень трудно диагностировать ошибки.

Конечно, ни один разработчик API с унцией ума не изменит значения открытых констант, если он сможет этого избежать, но могут быть случаи, когда это необходимо.

3 голосов
/ 11 февраля 2009

Обычно нет, если третья сторона хорошо спроектирована.

Однако, в (ужасном) случае, когда API изменяет сигнатуру метода или удаляет метод / класс, вам потребуется модификация и перекомпиляция собственного кода.

Например, если у вас есть doSomething(String value);, который стал doSomething(int value); (или String doSomething() становится int doSomething()), тогда код вашего приложения, который вызывает doSomething (...), больше не будет работать. Поэтому требуется изменить ваш код (а затем перекомпилировать).

Однако вы должны знать, что этот случай крайне редок (за исключением случаев, когда вы используете, например, зависимость до альфа). Как правило, для обеспечения обратной совместимости API никогда не удаляют классы или методы. Вместо этого используется аннотация @Deprecated, чтобы заставить разработчика использовать другой метод / класс ...

3 голосов
/ 11 февраля 2009

Нет, вам нужно только перекомпилировать измененный код.

1 голос
/ 11 февраля 2009

Java - это не C ++: когда вы используете библиотеку, вы не импортируете ни одной строки кода. Вы просто загружаете библиотеку по запросу и используете это. По этой причине вам не нужно перекомпилировать код:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...