gpt4 book ai didi

java - 无法运行包含依赖项的可执行 jar

转载 作者:行者123 更新时间:2023-12-04 06:27:06 24 4
gpt4 key购买 nike

如果我仍然不知道如何运行由 maven 生成的可执行 jar,我就会陷入困境并感到羞耻。

myapp-uberjar.jar 包含以下内容:

com/myapp/...(我所有的项目包和类都在这里)
元信息/ list .MF
依赖1.jar
依赖2.jar
...

list 看起来也不错(为了简洁起见,我在这里删除了一些依赖项):

list 版本:1.0
存档器版本:Plexus Archiver
创建者:Apache Maven
builder :rabdi
构建-Jdk:1.6.0_18
主类:com.myapp.core.main.Boot
类路径:spring-context-3.0.5.RELEASE.jar spring-context-support-3.0.5.RELEASE.jar spring-test-3.0.5.RELEASE.jar axis-1.4.jar axis-jaxrpc-1.4。 jar 轴
-saaj-1.4.jar 轴-wsdl4j-1.5.1.jar commons-discovery-0.2.jar xml-api
s-1.0.b2.jar log4j-1.2.15.jar commons-pool-1.5.4.jar hamcrest-core-1.1.jar junit-de
p-4.8.2.jar


现在,当我运行 jar 时,出现以下错误:

D:\myapp\target>java -jar myapp-uberjar.jar
线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/log4j/Logger
在 com.myapp.core.main.Boot.(Boot.java:14)
引起:java.lang.ClassNotFoundException:org.apache.log4j.Logger
在 java.net.URLClassLoader$1.run(Unknown Source)
在 java.security.AccessController.doPrivileged(Native Method)
在 java.net.URLClassLoader.findClass(Unknown Source)
在 java.lang.ClassLoader.loadClass(来源不明)
在 sun.misc.Launcher$AppClassLoader.loadClass(来源不明)
在 java.lang.ClassLoader.loadClass(来源不明)
... 1 更多
找不到主类:com.myapp.core.main.Boot。程序将会退出。

为什么它不起作用?如何让它工作。

谢谢!

最佳答案

如果您的 distribute my program as single zip with my jar and libraries ,那么你必须建立一个类路径。
如果您希望依赖项将库放在 jar 之外(强烈推荐),则必须使用程序集插件(或其他插件)。
这是如何做到这一点的完整解释:
pom 构建元素:

<build>
<!-- final name set the jar name, if left it
will give defualt "${artifactId}-${version}" -->
<finalName>jar final name</finalName>
<sourceDirectory>src</sourceDirectory>

<!-- compiler plug in -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- assembly plugin -->
<!-- the assembly plugin is used to define your
final deploy output (jar, zip, dir, war, etc..)-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>assembly:package</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- The filename of the assembled distribution
file defualt ${project.build.finalName}-->
<finalName>${project.build.finalName}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<!-- A list of descriptor files path to generate from-->
<descriptors>
<descriptor>assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
<!-- jar plug in -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
<!-- to create a class path to your
dependecies you have to fill true in this field-->
<addClasspath>true</addClasspath>
<!-- if you put your dependencySet/outputDirectory
in the assembly file is in a specific folder (lib for example),
you need to add classpathPrefix-->
<classpathPrefix>lib/</classpathPrefix>

<!-- if you defined your dependencySet/outputFileNameMapping
in the assembly, instead of using the classpathPrefix,
you should use customClasspathLayout,
add the classpathPrefix at the begining of the
customClasspathLayout, and then add the pattern of the outputFileNameMapping,
NOTICE YOU NEED TO ADD '$' BEFOR OF EACH '$'.
supported only from version 2.3>-->
<!--<classpathLayoutType>custom</classpathLayoutType>
<customClasspathLayout>
lib/$${artifact.groupId}.$${artifact.artifactId}.$${artifact.extension}
</customClasspathLayout>-->

</manifest>

<manifestEntries>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>

</configuration>
</plugin>

</plugins>
</build>

汇编文件:
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<!--the id will be add to the end of the distribution file -->
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>


<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>icons</directory>
<outputDirectory>icons</outputDirectory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
<fileSet>
<directory>conf</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>

<files>
<!-- you need to create the bat file yourself -->
<file>
<source>batFileName.bat</source>
<filtered>true</filtered>
</file>
</files>

<dependencySets>
<dependencySet>
<!--define the outputDirectory of the dependencies,
NOTICE: if it's diffrent from '/' make sure to
change the classPath configuration for
the maven-jar-plugin in the pom-->
<outputDirectory>lib</outputDirectory>
<!-- maping the dependencies jar names.
NOTICE : if you used this definition, you need to use
customClasspathLayout classPath configuration
for the maven-jar-plugin in the pomg-->
<outputFileNameMapping>
${artifact.groupId}.${artifact.artifactId}.${artifact.extension}
</outputFileNameMapping>
<unpack>false</unpack>
</dependencySet>
</dependencySets>

</assembly>

关于java - 无法运行包含依赖项的可执行 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5913899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com