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