Spring-AOP @ Inject с Maven не работает только в релизных сборках - PullRequest
1 голос
/ 11 августа 2011

Я использую поддержку Spring-AOP для вставки ссылок через @Inject в объекты, не управляемые beanfactory Spring.Например:

@Configurable(preConstruction=true)
class DefaultContent implements Content 
  {
    @Inject @Nonnull
    private Site site;

    @Inject @Nonnull
    private ModelFactory modelFactory;

    public DefaultContent (final @Nonnull FileObject file)
      {
        resource = modelFactory.createResource(file);   // <--here
      }

Я использую статическое переплетение кода.

Я думаю, что я хорошо знаю все связанные технологии, и это действительно хорошо работает ... во время нормального цикла разработки (сMaven).Вчера я подготовил релиз (с плагином релиза Maven), и бинарные файлы в релизе, похоже, не сработали, так как я получаю NPE в строке, помеченной «здесь».

Чтобы объяснить лучше, до вчерашнего дня мойПроект был в режиме SNAPSHOT (1.0-ALPHA-2-SNAPSHOT).Двоичные файлы из моментального снимка работают.Двоичные файлы от 1.0-ALPHA-2, режим выпуска, нет.Двоичные файлы на следующем снимке, 1.0-ALPHA-3-SNAPSHOT, снова работают.Единственная черная дыра - выпущенные двоичные файлы.Что касается diff, между SNAPSHOT и релизом нет никаких других отличий, кроме меток версий модулей.

До сих пор я исключал, что проблема связана с чем-то странным во время процесса релиза Maven,поскольку двоичные файлы содержат ошибки, даже когда я воссоздаю 1.0-ALPHA-2 из источников с тегами в «простой» сборке (то есть просто чистой установке mvn).Я также использовал декомпилятор Java, чтобы посмотреть на эффективный источник (пост-волны) неисправного класса, сравнивая код из 1.0-ALPHA-2 и 1.0-ALPHA-3-SNAPSHOT.Они выглядят одинаково.Наконец, я сравнил двоичные файлы (файл .war, работающий в Jetty), и они содержат одинаковые элементы (то есть, отсутствуют отсутствующие зависимости, единственное отличие - мои jar-файлы с другой версией).

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

1 Ответ

0 голосов
/ 11 августа 2011

Мне удалось обойти эту проблему, изменив перечисленную зависимость (а также несколько других) на:

@Inject @Nonnull
private Provider<Site> site;

Поставщик - это способ вставлять «ленивые» зависимости, которые должны быть отложены до

site.get()

Обратите внимание, что в прошлом я уже использовал некоторые зависимости Provider <> в своем проекте, поскольку обнаружил некоторую неразрешимую циклическую зависимость - обычно Spring явно выдает уведомление об ошибке. Так что это не полный ответ на мой пост - учтите, что при запуске SNAPSHOT это изменение не требуется; неразрешимая циклическая зависимость не может быть неразрешимой или разрешимой при изменении несвязанной детали проекта, такой как SNAPSHOT / версия выпуска ...

Так что, я полагаю, я вызвал какую-то ошибку в Spring AOP. Тем не менее, провайдер <> совершенно приемлем для меня.

...