Конфликт версии Grails log4j со сторонним API Java

Я должен использовать сторонний Java API от Cisco, который использует более старую версию Log4J, т.е. 1.1.3. При автономном запуске очевидно, что API работает нормально, но при запуске из Grails (1.3.7) происходит сбой с некоторой «Операция не найдена» исключение во время инициализации Log4j.

Как я могу разрешить это столкновение?

Вот фактический плагин BuildConfig, который содержит библиотеку cisco в папке lib.

grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
//grails.project.war.file = "target/${appName}-${appVersion}.war"
grails.plugin.location.'advoss-orm-core' = "../../../advoss-orm-core-grails-plugin/branches/ShahbazORMPlugin"

grails.project.dependency.resolution = {
    // inherit Grails' default dependencies
    inherits("global") {
        // uncomment to disable ehcache
        // excludes 'ehcache'
    }
    log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
    repositories {
        grailsPlugins()
        grailsHome()
        grailsCentral()

        // uncomment the below to enable remote dependency resolution
        // from public Maven repositories
        mavenLocal()
        mavenCentral()

        flatDir  name:"lib", dirs:"lib"
        //mavenRepo "http://snapshots.repository.codehaus.org"
        //mavenRepo "http://repository.codehaus.org"
        //mavenRepo "http://download.java.net/maven/2/"
        //mavenRepo "http://repository.jboss.com/maven2/"
    }
    dependencies {
        runtime('mysql:mysql-connector-java:5.1.16') {
            transitive = false
        }
        compile ':command:1.0',
                ':commons-codec:1.3',
                ':commons-httpclient:3.1',
                ':commons-logging:1.1.1',
                ':deltawing:1.0',
                ':deltaxml:1.0',
                ':isorelax:1.0',
                ':jhall:1.0',
                ':jing:1.0',
                ':junit-dep:4.9b2',
                ':marklogic-xcc:4.2.2',
                ':metadata-extractor:2.3.1',
                ':msv:1.0',
                ':resolver:1.0',
                ':saxon:9pe',
                ':tagsoup:1.2',
                ':xep:1.0',
                ':xmlunit:1.3'
    }
}

Теперь вот конфигурация сборки проекта, который включает вышеуказанный плагин и не может выполнять вызовы библиотеки Cisco с ошибками Log4j:

grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.plugin.location.'adv-provisioning-server' = "../../../adv-provisioning-server/branches/AlamSher_AdvProvisioningServer"
grails.plugin.location.'advoss-orm-core' = "../../../advoss-orm-core-grails-plugin/branches/ShahbazORMPlugin"
//grails.plugin.location.'advoss-trouble-ticket' = "../../../advoss-trouble-ticket-grails-plugin/branches/ShahbazTroubleTicketPlugin"

//grails.project.war.file = "target/${appName}-${appVersion}.war"

grails.project.dependency.distribution = {
    remoteRepository(id: "release", url: "http://192.168.0.2:8080/artifactory/plugins-release-local") {
        authentication username: "maven_user", password: "mav3nus3r"
    }
}

grails.project.dependency.resolution = {

    pom true

    // inherit Grails' default dependencies
    inherits("global") {
        // uncomment to disable ehcache
        // excludes 'ehcache'
    }
    log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
    repositories {

        mavenLocal()
        mavenCentral()
        mavenRepo "http://repository.codehaus.org"
        mavenRepo "http://download.java.net/maven/2/"

        grailsPlugins()
        grailsHome()
        grailsCentral()
    }

    dependencies {
        runtime('mysql:mysql-connector-java:5.1.16') {
            transitive = false
        }
        compile 'jaxfront:jaxfront-html:1.0',
                'jaxfront:jaxfront-pdf:1.0',
                'jaxfront:jaxfront-core:1.0',
                'advoss-voms:VomsWSClient:1.0',
                'com.lowagie:itext:2.1.7',
                'freemarker:freemarker:2.3.9',
//                'net.sourceforge.barbecue:barbecue:1.5-beta1',
//                'net.sf.jasperreports:jasperreports-fonts:4.0.0',
//                'net.sf.jasperreports:jasperreports-javaflow:3.7.5',
                'commons-httpclient:commons-httpclient:3.1',
                'commons-net:commons-net:20030805.205232'
//        compile('net.sf.jasperreports:jasperreports:4.0.1') {
//            transitive = false
//        }
        compile('net.sf.jasperreports:jasperreports:4.1.2') {
            excludes 'poi-ooxml', 'antlr', 'commons-beanutils',
                    'commons-collections', 'commons-logging',
                    'ant', 'mondrian', 'commons-javaflow',
                    'barbecue', 'xml-apis-ext', 'xml-apis',
                    'xalan', 'groovy-all', 'hibernate',
                    'saaj-api', 'servlet-api', 'xercesImpl', 'xmlParserAPIs',
                    'spring-core', 'bsh', 'spring-beans', 'jaxen',
                    'barcode4j', 'batik-svg-dom', 'batik-xml',
                    'batik-awt-util', 'batik-dom', 'batik-css',
                    'batik-gvt', 'batik-script', 'batik-svggen',
                    'batik-util', 'batik-bridge', 'persistence-api',
                    'jdtcore', 'bcmail-jdk14', 'bcprov-jdk14', 'bctsp-jdk14'
        }
    }

    plugins {
        compile ':jsecurity:0.4.1',
                ':message-digest:1.1',
                ':quartz:0.4.2',
                ':export:0.7',
                ':jquery:1.4.4.1',
                ':jquery-ui:1.8.2',
                ':xml-validator:0.1',
                ':advoss-orm-core:1.0.2.0',
        compile (':adv-provisioning-server:1.0.0.1') {
            excludes('commons-httpclient')
        }
        runtime(':jasper:1.2') { excludes 'jasperreports' }
    }
}

person ask-dev    schedule 04.04.2012    source источник
comment
Есть ли шанс, что у Cisco есть обновленный файл .jar, в котором используется более поздняя версия log4j? 1.2.x доступен с 2004 года; этого времени им более чем достаточно, чтобы обновить свою библиотеку.   -  person leedm777    schedule 13.04.2012


Ответы (1)


Если я правильно понимаю, вы сталкиваетесь с конфликтующими зависимостями.

Предположим, что сторонняя библиотека Cisco была разрешена из maven с помощью этой строки артефакта: "com.cisco.foo". Вы должны добавить закрытие после части BuildConfig.groovy, чтобы исключить транзитивную зависимость Log4J, например:

dependencies {
  // ... other dependencies
  compile("com.cisco.foo") {
    excludes "log4j"
  }
}

Это фактически просто исключит Log4J 1.1.3, который был включен в библиотеку Cisco.

РЕДАКТИРОВАТЬ: Если JAR находится только в lib/ вместо битов выше, IIRC вы можете сделать что-то вроде:

dependencies {
  // ... other dependencies
  inherits("global") {
    excludes "log4j"
  }
}

Однако в этом случае log4j 1.1.3 также находится в каталоге lib/ или Cisco JAR представляет собой толстую банку с классами Log4J. Последний случай может быть намного сложнее, и вы должны добавить это к своему вопросу, если это так.

person Eric Wendelin    schedule 06.04.2012
comment
JAR библиотеки Cisco находится только в папке lib проекта и не разрешается из BuildConfig. Будет ли вышеописанное работать? - person ask-dev; 07.04.2012
comment
Извините, был занят другим. Да, похоже, это толстая банка. Это дает мне ошибку «NoSuchMethodError» в некоторых RollingFileAppender, если я предоставлю ему другую версию Log4j, чем 1.1.3 - person ask-dev; 11.04.2012
comment
Не могли бы вы опубликовать как можно больше вашего BuildConfig.groovy? - person Eric Wendelin; 11.04.2012
comment
Пожалуйста, проверьте, поможет ли это вам разобраться. Я отредактировал вопрос, чтобы опубликовать необходимые файлы BuildConfig. - person ask-dev; 13.04.2012
comment
Я не могу сказать из файлов конфигурации, откуда берется зависимость log4j. Вы можете сделать пару вещей: Запустите grails dependencyReport и посмотрите, какая библиотека включает log4j, и исключите ее из этой зависимости. Вы также можете попробовать исключить log4j из библиотеки Cisco и включить свой собственный. - person Eric Wendelin; 13.04.2012