泽西和杰克逊的maven依赖问题?

时间:2011-06-30 15:32:18

标签: jersey jackson

我刚刚开始使用泽西和杰克逊构建一个网络应用程序。在最初启动并运行后,我认为从长远来看将项目转换为maven是有道理的。我对maven很新,看起来我可能遇到了泽西和杰克逊之间的依赖问题。

我整理了一个简单的测试来检查在使用jackson的一些项目测试的问题后,所有内容都已正确设置。用户对象基于jackson tutorial

中的对象
@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

我尝试在一个简单的maven java应用程序中运行相同的测试,以确保我设置jackson依赖项的方式没有问题,一切正常。我怀疑这个问题是由于泽西和杰克逊之间的一些依赖性问题引起的,因为它也使用了杰克逊。我也怀疑我拼凑的方式将我的网络应用程序的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 个答案:

答案 0 :(得分:3)

正如已经提到的,这可能是一个版本冲突(错误消息确实表明某些东西是针对1.8编译的,但早期版本正在以某种方式使用)。

我注意到引起问题的一件事是“核心”和“映射器”罐子的版本可能不同。在这种情况下,例如,它听起来像正在使用映射器版本1.8,但核心jar版本更早。尽管杰克逊核心jar确实定义了正确的版本,但Maven可能不依赖于该信息,而是依赖于其他组件的一些要求。

因此,每当从您自己的pom.xml指定对Jackson的依赖时,请确保核心(jackson-asl-core)和mapper(jackson-ask-mapper)的版本都已定义,并具有相同的值(或至少相同的次要版本,1.8.x)。

答案 1 :(得分:3)

升级datanucleus-hbase lib后,我遇到了同样的问题。

我的解决方案是包含两个jackson库:

        <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>

答案 2 :(得分:0)

jersey-json依赖项有自己的jackson依赖项。

对于Jersey 1.8,Jackson 1.7.1。因此,从删除1.8.1和1.8.2依赖项开始,它们可能会带来麻烦。 Maven不是确定性的:如果遇到相同依赖的两个版本(具有相同的计数),则无法预测所选择的版本。

您不必创建JSON字符串也不必自己调用Jackson mapper。看看我在GitHub上发布的this fully working/tested app。希望它会有所帮助。