簡體   English   中英

maven 項目 java -jar: 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,現在我又回到了原來的錯誤。

更新2

當我打開存檔時,我看到了這個:

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描述符。 可以在以下問題中找到更多詳細信息:

在 jar 和 Maven 中包含依賴項

如何使用 Maven 創建具有依賴項的可執行文件/可運行文件 JAR?


或者,您可以在 Java 類路徑中添加mail-1.6.2.jar ,如下所示:

java -jar "myjar.jar" -cp "./path/to/mail-1.6.2.jar:./path/to/other.jar"

請注意,類路徑分隔符在 Linux(冒號)和 Windows(分號)上是不同

pom.xml

<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>

package

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

SendMailApp-0.0.1-SNAPSHOT.jar/META-INF/MANIFEST.MF

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來自mainClassaddClasspath

  • MANIFEST.MF 如果來自manifest

<artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>org.example.SendMailApp</mainClass>
            </manifest>
          </archive>
        </configuration>

參考 - 如何使用 Maven 創建具有依賴關系的可執行/可運行 JAR?

如何使用 Maven 創建具有依賴項的可執行文件/可運行文件 JAR?

來自@Peter Mortensen 和@André Aronsen 的回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM