Спецификация Spring, ведение журнала общих ресурсов, управление зависимостями Log4j2 и Maven

Я создаю родительский POM для нескольких модулей. Они используют Spring и Log4j2, поэтому я хочу определить соответствующую конфигурацию в разделе родительского POM и использовать новую функцию Spring BOM, чтобы избежать беспорядка с версиями компонентов Spring.

Согласно документации, это правильное использование Spring BOM:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
    .......
</dependencyManagement>

Теперь мне нужно исключить зависимость от commons-logging из spring-core. Это правильный способ сделать это, согласно документы Spring:

<dependencyManagement>
    .......
    <!-- Remove JCL from Spring deps -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.0.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- Add Log4j2 with JCL bridge -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>${log4j2.version}</version>
    </dependency>
    .......
</dependencyManagement>

Удаление номера версии из определения зависимости spring-core вызывает ошибку отсутствия версии spring-core на этапе компиляции ('dependencies.dependency.version' for org.springframework:spring-core:jar is missing). По сути, это требует от меня повторного указания номера версии Spring - то, что Spring BOM должен был решить.

Знаете ли вы какой-либо способ заставить эту работу работать только на основе версии спецификации?


person Anton    schedule 23.08.2015    source источник
comment
Вы поместили его под тег dependencyManagement? Возможно, вам следует поместить его в зависимости, а не в dependencyManagement.   -  person Koby    schedule 23.08.2015
comment
@Koby Не для родительского POM. Они должны быть в dependencyManagement — я определяю версии зависимостей, а не объявляю их использование.   -  person Anton    schedule 23.08.2015
comment
Почему исключение общего ведения журнала из-под зависимостей? Он также должен находиться под управлением зависимостей.   -  person Tarlog    schedule 23.08.2015
comment
@Tarlog Я использую Log4j2, у которого есть собственный мост JCL, поэтому мне нужно явно исключить это. В документы они поставили SLF4J в качестве примера, но идея та же.   -  person Anton    schedule 23.08.2015
comment
Да я понимаю, но почему не в разделе dependencyManagement? Вы настраиваете родительский pom, верно? Таким образом, у вас нет прямой зависимости.   -  person Tarlog    schedule 23.08.2015
comment
@Tarlog Я обновил образец POM, чтобы подчеркнуть ... Теперь он выглядит лучше?   -  person Anton    schedule 23.08.2015
comment
Да, это лучше. Без понятия, извини. Я могу только предложить использовать свойства, чтобы вы могли иметь ${spring.version} , как вы делаете с log4j.   -  person Tarlog    schedule 23.08.2015


Ответы (2)


Почему бы вам не поместить исключение непосредственно в объявление bom:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>${spring.version}</version>
            <type>pom</type>
            <scope>import</scope>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>

Или вы также можете добавить ведение журнала общих ресурсов в dependencyManagement, если хотите напрямую контролировать его версию. Вот что я сделал в недавнем проекте:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>${spring.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commons-logging.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>
person bischoje    schedule 19.01.2016
comment
Сейчас сложно сказать, то ли я пробовал и не получилось, то ли не думал об этом. Сейчас я работаю над другим проектом в другой компании, поэтому я не могу проверить ваше предложение... - person Anton; 20.01.2016
comment
Для первой части вам понадобится Maven 3.4 или более поздней версии MNG-5600. - person beat; 25.11.2016

Мост log4j jcl не заменяет банку журналирования общих ресурсов. Оставьте это. Он просто создает привязку между ведением журнала Commons и log4j2.

person rgoers    schedule 20.01.2016