我有一个使用 fasterxml/jackson-databind 的最小 Maven 项目
package com.mycompany.app;
import com.fasterxml.jackson.databind.ObjectMapper;
class MyValue { public String name; public int age; }
public class App {
public static void main( String[] args ) {
try {
// ObjectMapper mapper = new ObjectMapper();
// MyValue value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
System.out.println( "Hello" );
}
catch (Exception e) {}
}
}
当我编译并运行 without
jackson-databind
就很好了:
$ mvn package
$ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Hello
当我将依赖项添加到
pom.xml
时,我看到相关的jar已下载
< ... omitted for brevity ...>
Downloaded from central: https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.13.0/jackson-databind-2.13.0.jar (1.5 MB at 3.0 MB/s)
< ... omitted for brevity ...>
但是当我取消注释并尝试使用 jackson-databind 时,我得到:
$ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at com.mycompany.app.App.main(App.java:10)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
为了完整性,这里是
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<properties>
<maven.compiler.release>11</maven.compiler.release>
<jackson.version>2.13.0</jackson.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
默认情况下,Maven 不会在应用程序的 jar 中放置任何依赖项,因此您必须在命令行(不仅在 pom.xml 中)使用
-cp
或 在 Manifest 中指定它们;在这两种情况下,您都需要外部 jar 来运行应用程序,这意味着您必须将它们与应用程序一起分发。
另一种方法是使用 Maven Shade Plugin 创建一个“uber-jar”,其中包含应用程序的类和库的类。
为了完整起见,在基于 Spring Boot 的应用程序(不是您的情况)中,您可以使用 Spring Boot Maven 插件创建一个“fat jar”(包含其他 jar 的 jar)。
你的错误是:jackson不在类路径中,所以jvm不知道它,它与maven没有直接关系,但maven会通过使用插件来帮助你解决问题。
你可以将 jackson 添加到你的类路径中,但是 Maven 可以帮助你,有很多解决方案:
我的首选技术是使用可执行 jar(2.),然后您将使用以下命令运行应用程序:
java -jar myApplication.jar
这是pom配置:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>yourapp</groupId>
<artifactId>app</artifactId>
<version>0.0.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.mainClass>pdem.javen.Javen</java.mainClass>
<dest>${project.basedir}</dest>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.14.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<mainClass>${java.mainClass}</mainClass>
<addClasspath>true</addClasspath>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<classpathPrefix/>
<useUniqueVersions>true</useUniqueVersions>
</manifest>
<manifestEntries>
<Class-Path>/conf</Class-Path>
<Build-Time>${maven.build.timestamp}</Build-Time>
</manifestEntries>
<manifestFile/>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<finalName>${project.name}</finalName>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
和文件 assembly.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>dist</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>dir</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>conf</outputDirectory>
<filtered>true</filtered>
<includes>
<include>conf.properties</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.basedir}/src/bin</directory>
<outputDirectory>bin</outputDirectory>
<includes>
<include>*</include>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
</assembly>
进入 target/...dist/lib 目录,您将拥有所有 jars。你从这个目录运行 java-jar yourapp.jar