Пролетна BOM, общ запис, 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. Това е правилният начин да го направите, според Пролетни документи:

<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 трябваше да реши.

Знаете ли някакъв начин да накарате това да работи само въз основа на 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
Защо изключването на общо регистриране при зависимости? Предполага се, че също е под dependencyManagement.   -  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. Оставете го вътре. Той просто създава обвързване между Commons logging и log4j2.

person rgoers    schedule 20.01.2016