簡體   English   中英

java-maven-idea:包括 jar 中的外部庫

[英]java-maven-idea: including external library in jar

我正在制作電報機器人,我需要.jar 將其部署在雲中。
我在 intellij idea 中使用 maven 構建它,但是當嘗試在我的機器上執行時,它會拋出這個:

Exception in thread "main" java.lang.NoClassDefFoundError: org/telegram/telegrambots/bots/TelegramLongPollingBot<br>

據我了解,這是因為 maven 沒有將此庫打包到.jar 中。
我怎樣才能做到這一點?

粗略地說,你有兩個選擇

  1. 制作一個“胖” JAR 並提供所有必需的類
  2. 制作引用其他 JAR 文件的“瘦” JAR

什么最適合您的情況,只有您可以決定。 這是你如何做到的:

制作一個“胖” JAR 並提供所有必需的類

要遵循這種方法,您可以使用Maven 陰影插件 在 package 階段,您將調用其shade目標 這會將依賴項中的類以及應用程序類一起復制到一個 JAR 文件中。 它在 POM 中可能如下所示:

<executions>
  <execution>
    <goals>
      <goal>shade</goal>
    </goals>
    <configuration>
      <finalName>my-packaged-application</finalName>
      <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
          <mainClass>com.mycompany.MyApplication</mainClass>
        </transformer>
      </transformers>
      <filters>
        <filter>
          <!--
            Shading signed JARs will fail without this.
            http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
          -->
          <artifact>*:*</artifact>
            <excludes>
              <exclude>META-INF/*.SF</exclude>
              <exclude>META-INF/*.DSA</exclude>
              <exclude>META-INF/*.RSA</exclude>
            </excludes>
          </filter>
        </filters>
      </configuration>
    </execution>
</executions>

這種方法的優點是您的應用程序被打包為一個文件。 缺點是比較大。 即使您只為新版本更改幾行代碼,整個文件也會有所不同。

制作引用其他 JAR 文件的“瘦” JAR

在這種方法中,JAR 僅包含您的應用程序類。 它的清單文件引用了類路徑,但您還需要為依賴項提供 JAR 文件。 要收集這些,請使用Maven 依賴插件,更具體地說是copy-dependencies目標 你像這樣配置它:

<executions>
  <execution>
    <id>copy</id>
    <phase>package</phase>
    <goals>
      <goal>copy-dependencies</goal>
    </goals>
    <configuration>
      <outputDirectory>${project.build.directory}/libs</outputDirectory>
      <stripVersion>true</stripVersion>
    </configuration>
  </execution>
</executions>

現在您在target/lib中擁有所有依賴 JAR 文件,最后一件事是確保“瘦” JAR 引用這些文件。 為此,請配置Maven Jar 插件

<configuration>
  <archive>
    <manifest>
      <addClasspath>true</addClasspath>
      <classpathPrefix>lib/</classpathPrefix>
      <mainClass>com.mycompany.MyApplication</mainClass>
    </manifest>
  </archive>
</configuration>

在這種方法中,如果您只更改應用程序代碼的幾行,則只會替換應用程序 JAR - 依賴項 JARs 保持不變。 不利的一面是,它要求您分發的不是一個文件而是一個目錄結構:應用程序 JAR 文件以及lib/文件夾及其內容。

暫無
暫無

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

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