mvn 无法集成依赖

问题描述 投票:0回答:2

我有一个使用 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>
java maven pom.xml
2个回答
1
投票

默认情况下,Maven 不会在应用程序的 jar 中放置任何依赖项,因此您必须在命令行(不仅在 pom.xml 中)使用

-cp
在 Manifest 中指定它们;在这两种情况下,您都需要外部 jar 来运行应用程序,这意味着您必须将它们与应用程序一起分发。

另一种方法是使用 Maven Shade Plugin 创建一个“uber-jar”,其中包含应用程序的类和库的类。

为了完整起见,在基于 Spring Boot 的应用程序(不是您的情况)中,您可以使用 Spring Boot Maven 插件创建一个“fat jar”(包含其他 jar 的 jar)。


0
投票

你的错误是:jackson不在类路径中,所以jvm不知道它,它与maven没有直接关系,但maven会通过使用插件来帮助你解决问题。

你可以将 jackson 添加到你的类路径中,但是 Maven 可以帮助你,有很多解决方案:

  1. 你用maven获取jackson jar并将其添加到你的类路径中:使用依赖插件
  2. 您制作一个可执行的 jar,它使用清单来查找另一个 jar:使用 maven-jar 插件 + 程序集插件
  3. 您可以使用制作 uberjar 的插件,Spring 使用此技术:参见 start.spring.io

我的首选技术是使用可执行 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

© www.soinside.com 2019 - 2024. All rights reserved.