![](/img/trans.png)
[英]java.lang.NoClassDefFoundError: javax/mail/MessagingException
[英]maven project java -jar : NoClassDefFoundError: javax/mail/MessagingException
我有一个 java 项目,它发送 maven 构建的 8833369671288(使用 Eclipse)并且它在 Eclipse 中工作没有问题,但是当尝试 package 一个可运行的 jar 时,我有一个问题
Error: Unable to initialize main class com.my.package.MyClass
Caused by: java.lang.NoClassDefFoundError: javax/mail/MessagingException
我有这个作为我的依赖:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
和插件设置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mypackage.MyClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mypackage.MyClass</mainClass>
<manifestEntries>
<Multi-Release>true</Multi-Release>
</manifestEntries>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
我可以在我的 maven 依赖项中看到 javax.mail-1.6.2.jar,所以不确定为什么我无法运行 jar...是否有我错过的配置选项?
谢谢!
我四处搜索并尝试了阴影和 jar 插件的多种变体,我希望能够使用 java -jar myjar.jar 从命令行运行 jar。 我在搜索中发现的大多数帖子都建议将邮件 jar 添加到类路径中,但这看起来已经完成了,因为 jar 在 maven 依赖项列表中。
根据以下建议尝试了多种变体。 尝试使用maven-assembly-plugin
确保添加<mainClass>com.etcetera.MyClass</mainClass>
标记。 通过这些变体no main manifest attribute, in myjar.jar
。 然后我添加了maven-jar-plugin
插件,还添加了主要的 class,现在我又回到了原来的错误。
当我打开存档时,我看到了这个:
Manifest-Version: 1.0
Created-By: Apache Maven 3.8.4
Built-By: myUserName
Build-Jdk: 15
似乎缺少Main-Class: com.javabyexamples.java.jar.HelloWorld
行
在构建 web 应用程序时,依赖项当然会捆绑在 .WAR/.EAR 中。
但是,默认情况下,Maven不会在 .jar 文件中捆绑依赖项。 (换句话说,jars 不会放在其他罐子里)。
不过,您可以使用jar-with-dependencies
描述符。 可以在以下问题中找到更多详细信息:
如何使用 Maven 创建具有依赖项的可执行文件/可运行文件 JAR?
或者,您可以在 Java 类路径中添加mail-1.6.2.jar
,如下所示:
java -jar "myjar.jar" -cp "./path/to/mail-1.6.2.jar:./path/to/other.jar"
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SendMailApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SendMailApp</name>
<description>SendMailApp</description>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.example.SendMailApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
mvn clean package
target
├── activation-1.1.jar
├── javax.mail-1.6.2.jar
└── SendMailApp-0.0.1-SNAPSHOT.jar
activation-1.1.jar & javax.mail-1.6.2.jar 来自 pom.xml maven-dependency-plugin
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
cd target
java -jar SendMailApp-0.0.1-SNAPSHOT.jar
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.8.6
Built-By: demo
Build-Jdk: 17.0.5
Class-Path: javax.mail-1.6.2.jar activation-1.1.jar
Main-Class: org.example.SendMailApp
REF pom.xml 配置
Main-Class
& Class-Path
来自mainClass
和addClasspath
MANIFEST.MF 如果来自manifest
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.example.SendMailApp</mainClass>
</manifest>
</archive>
</configuration>
如何使用 Maven 创建具有依赖项的可执行文件/可运行文件 JAR?
来自@Peter Mortensen 和@André Aronsen 的回答
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.