![](/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.