Джерси и Джексон Maven проблемы с зависимостями? - PullRequest
3 голосов
/ 30 июня 2011

Я только начал создавать веб-приложение, используя Джерси и Джексон. После первоначального начала работы я решил, что в конечном итоге имеет смысл преобразовать проект в мавенский. Я очень плохо знаком с Мейвеном и, похоже, столкнулся с проблемой зависимости между Джерси и Джексоном.

Я собрал простой тест, чтобы убедиться, что все было настроено правильно после того, как возникли проблемы с некоторыми из моих тестов проекта, которые используют Джексона. Пользовательский объект основан на объекте из учебника Джексона

@Test
public void testJacksonSetup() throws IOException {
    String json = "{\"name\":{\"first\":\"Joe\",\"last\":\"Sixpack\"},\"verified\":false,\"gender\":\"MALE\",\"userImage\":\"Rm9vYmFyIQ==\"}";
    ObjectMapper mapper = new ObjectMapper();
    User user =  mapper.readValue(json, User.class);
    assertEquals("Joe", user.getName().getFirst());
    Writer strWriter = new StringWriter();
    mapper.writeValue(strWriter, user);
    assertEquals(json, strWriter.toString());

}

, который выбрасывает следующее исключение

 org.codehaus.jackson.type.JavaType.isMapLikeType()Z
 java.lang.NoSuchMethodError: org.codehaus.jackson.type.JavaType.isMapLikeType()Z
    at org.codehaus.jackson.map.ser.BasicSerializerFactory.buildContainerSerializer(BasicSerializerFactory.java:396)
    at org.codehaus.jackson.map.ser.BasicSerializerFactory.buildContainerSerializer(BasicSerializerFactory.java:396)
    at org.codeh

Я попытался запустить тот же тест в простом Java-приложении maven, чтобы убедиться, что у меня не было проблем с тем, как я настроил зависимости Джексона, и все работало. Я подозреваю, что проблема вызвана некоторой проблемой зависимости между Джерси и Джексоном, так как он также использует Джексона. Я также подозреваю, что проблема, связанная с использованием файла pom для моего веб-приложения, может быть проблемой. Вот содержимое моего pom с некоторыми небольшими изменениями в именах (как я уже говорил, я плохо знаком с использованием maven, поэтому я бы сказал, что это довольно уродливый файл pom)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.myproject.app</groupId>
    <artifactId>app</artifactId>
    <version>0.1-SNAPSHOT</version>
</parent>
<groupId>com.myproject.app</groupId>
<version>${project.parent.version}</version>
<artifactId>my-web-app</artifactId>
<name>My web app</name>
<packaging>war</packaging>
<properties>
    <netbeans.hint.deploy.server>gfv3</netbeans.hint.deploy.server>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jersey-version>1.8-SNAPSHOT</jersey-version>
</properties>
<profiles>
    <profile>
        <id>default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>com.myproject.app</groupId>
                <artifactId>myproject-core</artifactId>
                <version>${project.parent.version}</version>
            </dependency>
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-server</artifactId>
                <version>${jersey-version}</version>
                <!--<scope>provided</scope>-->
            </dependency>
            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-json</artifactId>
                <version>${jersey-version}</version>
                <!--<scope>provided</scope>-->
            </dependency>
            <dependency>
                <groupId>com.sun.jersey.contribs</groupId>
                <artifactId>jersey-multipart</artifactId>
                <version>${jersey-version}</version>
                <!--<scope>provided</scope>-->
            </dependency>
            <dependency>
                <groupId>com.sun.jersey.jersey-test-framework</groupId>
                <artifactId>jersey-test-framework-grizzly2</artifactId>
                <version>${jersey-version}</version>
                <scope>test</scope>
            </dependency>
            <!-- for external testing -->
            <dependency>
                <groupId>com.sun.jersey.jersey-test-framework</groupId>
                <artifactId>jersey-test-framework-external</artifactId>
                <version>${jersey-version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
                <version>1.8.2</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-xc</artifactId>
                <version>1.8.1</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>
<build>
    <finalName>mywebapp</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <packagingExcludes>WEB-INF/glassfish-web.xml</packagingExcludes>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <inherited>true</inherited>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- Run the application using "mvn embedded-glassfish:run" -->
        <plugin>
            <groupId>org.glassfish</groupId>
            <artifactId>maven-embedded-glassfish-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <goalPrefix>embedded-glassfish</goalPrefix>
                <app>${basedir}/target/mywebapp.war</app>
                <autoDelete>true</autoDelete>
                <port>8080</port>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-server</artifactId>
                    <version>1.7</version>
                </dependency>
                <dependency>
                    <groupId>org.glassfish</groupId>
                    <artifactId>javax.servlet</artifactId>
                    <version>3.1</version>
                </dependency>
                <dependency>
                    <groupId>org.glassfish</groupId>
                    <artifactId>javax.ejb</artifactId>
                    <version>3.1</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.24</version>
            <configuration>
                <webApp>${basedir}/target/mywebapp.war</webApp>
                <contextPath>treemetrics-api-01</contextPath>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xslt-maven-plugin</artifactId>
            <version>1.0</version>
            <executions>
                <execution>
                    <id>update-gf-deps</id>
                    <phase>package</phase> <!-- append to the packaging phase. -->
                    <goals>
                        <goal>transform</goal> <!-- goals == mojos -->
                    </goals>
                    <configuration>
                        <xslFile>src/main/xslt/gf.xsl</xslFile>
                        <srcDir>.</srcDir>
                        <srcIncludes>pom.xml</srcIncludes>
                        <destDir>target/gf-pom-file</destDir>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<pluginRepositories>
    <pluginRepository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/2/</url>
        <layout>default</layout>
    </pluginRepository>
    <pluginRepository>
        <id>maven2-glassfish-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/glassfish/</url>
    </pluginRepository>
</pluginRepositories>
<repositories>
    <repository>
        <id>glassfish-repository</id>
        <name>Java.net Repository for Glassfish</name>
        <url>http://download.java.net/maven/glassfish</url>
    </repository>
    <repository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/2/</url>
        <layout>default</layout>
    </repository>
</repositories>

Кто-нибудь знает, что вызывает проблемы с Джексоном и существует ли проблема зависимости с Джерси и как ее решить?

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Как уже упоминалось, это, вероятно, конфликт версий (сообщение об ошибке действительно предполагает, что что-то скомпилировано с 1.8, но более ранняя версия используется каким-то образом).

Одна вещь, которую я заметил, вызывает проблемыв том, что версии jar "core" и "mapper" могут отличаться.В этом случае, например, звучит так, как будто использовалась версия mapper 1.8, но версия jar ядра была раньше.Несмотря на то, что jar-ядро Jackson определяет правильную версию, Maven может полагаться не на эту информацию, а в зависимости от версии, которая требует некоторых других компонентов.

Так что при указании зависимости от Jackson из вашего собственного pom.xml убедитесь, что версии core (jackson-asl-core) и mapper (jackson-ask-mapper) определены и имеют одинаковое значение (или, по крайней мере, те же минорные версии, 1.8.x).

3 голосов
/ 20 марта 2012

У меня возникла та же проблема после обновления библиотеки datanucleus-hbase.

Мое решение состояло в том, чтобы включить две библиотеки Джексона:

        <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-hbase</artifactId>
        <version>3.1.0-m1</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.4</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.4</version>
    </dependency>
0 голосов
/ 30 июня 2011

Зависимости jersey-json имеют собственную зависимость Джексона.

Для Джерси 1.8 это Джексон 1.7.1. Итак, начните с удаления зависимостей 1.8.1 и 1.8.2, они могут вызвать проблемы. Maven не является детерминированным: если он встречает две версии одной и той же зависимости (с одним и тем же счетчиком), выбранная версия не может быть предсказана.

Вам не нужно ни создавать строку JSON, ни самим вызывать картограф Джексона. Взгляните на это полностью работающее / протестированное приложение , которое я опубликовал на GitHub. Надеюсь, это поможет.

...