Java:运行带有依赖项的jar

xxslljrj  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(159)

我已经打包了我的mvn项目。
之后,我的jar文件只包含我手工编写的类:

META-INF/
META-INF/MANIFEST.MF
me/
me/jeusdi/
me/jeusdi/slab/
me/jeusdi/slab/MyService.class
me/jeusdi/slab/App.class
me/jeusdi/slab/MyConfig.class
me/jeusdi/slab/MyServiceImpl.class
META-INF/maven/
META-INF/maven/me.jeusdi.slab/
META-INF/maven/me.jeusdi.slab/slab/
META-INF/maven/me.jeusdi.slab/slab/pom.xml
META-INF/maven/me.jeusdi.slab/slab/pom.properties

不过,我需要声明的maven依赖项:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>me.jeusdi.slab</groupId>
  <artifactId>slab</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>slab</name>
  <url>http://maven.apache.org</url>

  <properties>
    <kafka.streams.version>3.4.0</kafka.streams.version>
    <spring.version>6.0.5</spring.version>

    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
  </properties>
  
  <dependencies>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-streams</artifactId>
        <version>${kafka.streams.version}</version>
    </dependency>

    <!-- Spring Core -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- Spring Context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

  </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

为什么spring-core依赖项没有出现在我的jar中。
我需要运行我的jar。当前,我正在使用:

java -cp target/slab-1.0-SNAPSHOT.jar App

关于如何嵌入或定位依赖项并运行应用程序,您有什么想法吗?

jmo0nnb3

jmo0nnb31#

您可以使用Maven创建一个包含所有类的uber-jar,也可以让Maven下载您的依赖项。
我通常做的是和你一样生成jar,然后自动将所有依赖项下载到lib文件夹中。为了使运行jar像java -jar ...一样简单,我甚至让Maven将类路径添加到清单中。唯一的缺点是,现在需要将jar和它的库完全分布在这个目录结构中。优点是,任何签名的jar都将保留它。S的签名并因此确定有效性。

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <outputDirectory>${project.build.directory}/dist</outputDirectory>
                <archive>
                    <manifest>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib</classpathPrefix>
                        <mainClass>${mainclass}</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/dist/lib</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>
f3temu5u

f3temu5u2#

如果要包含具有依赖关系的jar,可以添加以下内容

<plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </plugin>

只需将<mainClass>fully.qualified.MainClass</mainClass>中完全限定的. MainClass替换为具有main的任何类即可
要构建它,可以运行mvn clean compile assembly:single
有关详细信息,请参见https://stackoverflow.com/a/574650/5622596
至于如何运行jar,一种可能的方法是运行下面的java -jar NameOfJar.jar,只需将NameOfJar.jar替换为您创建的任何jar即可

相关问题