I'm a relatively new Java programmer, and I've only worked with Maven and Jackson on a couple projects.
In my current project, I am attempting to build a process I can run on Heroku (which I'm brand new to) once every 24 hours. Part of this program uses Jackson to deserialize json to use in an array. When run through my IDE (IntelliJ), everything works fine. However, when I run the program after a mvn package
I get the following error:
Exception in thread "main" java.lang.VerifyError:
(class: org/codehaus/jackson/map/ObjectMapper, method: <init> signature: (Lorg/codehaus/jackson/JsonFactory;Lorg/codehaus/jackson/map/SerializerProvider;Lorg/codehaus/jackson/map/DeserializerProvider;Lorg/codehaus/jackson/map/SerializationConfig;Lorg/codehaus/jackson/map/DeserializationConfig;)V) Bad type in putfield/putstatic
at com.example.project.Main.main(Main.java:47)
This is obviously a showstopper since it keeps me from deploying to Heroku.
The line throwing the error is when I initialize an ObjectMapper:
ObjectMapper mapper = new ObjectMapper();
As for my POM, I was following this tutorial from Heroku. Here are the relevant sections from my POM:
...
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<assembleDirectory>target</assembleDirectory>
<programs><program>
<mainClass>com.example.project.Main</mainClass>
<name>main</name>
</program></programs>
</configuration>
<executions>
<execution>
<phase>package</phase><goals><goal>assemble</goal></goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals><goal>copy-dependencies</goal></goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mrbean</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-asl</artifactId>
<version>0.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
...
</dependencies>
...
So my process is a mvn clean install
and a mvn package
(where both succeed), and then sh target/bin/main
(where we get the error).
If I can provide any more useful information, please let me know! Thanks in advance!
EDIT:
After running my program differently...
java -cp target/classes:"target/dependency/*" com.example.project.Main
I found that I essentially ran into the same problem as @Jithin from this post:
Jackson + Tomcat - java.lang.VerifyError: Cannot inherit from final class
The error was coming from having conflicting Jackson versions in my classpath/dependency tree (i.e., one of my other dependencies was also using Jackson). I found that, in my case, the only Jackson dependency I required was jackson-annotations
. The program now runs like a charm! Hopefully this helps someone down the road.