Maven:使用指定主类和属性文件的shade-plugin编译项目

2024-05-02

刚接触 Maven,我试图使用 Maven 和 maven-shade-plugin 来编译一个项目(因为它似乎是构建 fat jar 的最佳插件)。我尝试指定我的主类来制作可运行的 jar 文件和一些包含翻译字符串的 .properties 文件。

根据 netbeans 输出,编译和构建似乎已通过,但我无法按如下方式运行它(假设 Maven 构建的 jar 被重命名为“程序”):

/usr/bin/java -cp program.jar bot.Main
> could not find or load main class bot.Main

这是我的项目文件结构:

这是我的 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
    <resources>
    <resource>
        <directory>src/main/java/resources</directory>
        <includes>
            <include>**/*.properties</include>
        </includes>
    </resource>
</resources>
<plugins>

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
      <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
        <mainClass>bot.Main</mainClass>
      </manifest>
    </archive>
    <shadedArtifactAttached>true</shadedArtifactAttached>
    <shadedClassifierName>launcher</shadedClassifierName>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

  <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <executions>
          <execution>
              <goals>
                  <goal>java</goal>
              </goals>
          </execution>
      </executions>
      <configuration>
          <mainClass>bot.Main</mainClass>
      </configuration>
  </plugin>

</plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots</artifactId>
        <version>2.4.0</version>
        <classifier>jar-with-dependencies</classifier>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>
</dependencies>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>

资源是否正确包含?为什么在不指定主类的情况下无法使用 java -jar 命令运行我的程序?它说我“无效或损坏的 jar 文件”,这应该意味着它无法运行。

另外,为什么两者都不开始指定主类路径?


问题在于您的 Shade 插件的配置,该插件当前为

<configuration>
  <archive>
    <manifest>
      <addClasspath>true</addClasspath>
      <classpathPrefix>lib/</classpathPrefix>
      <mainClass>bot.Main</mainClass>
    </manifest>
  </archive>
  <shadedArtifactAttached>true</shadedArtifactAttached>
  <shadedClassifierName>launcher</shadedClassifierName>
</configuration>

没有<archive>参数到shade goal https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html。您使用的配置元素不存在这一事实不是一个错误 https://stackoverflow.com/a/40601037/1743880,配置将被忽略,这解释了为什么你的主类没有在清单中设置。

要使用 Shade 插件构建可执行 JAR,您需要提供ManifestResourceTransformer https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html as a transformers https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#transformers。正确的配置是:

<configuration>
  <transformers>
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
      <mainClass>bot.Main</mainClass>
    </transformer>
  </transformers>
  <shadedArtifactAttached>true</shadedArtifactAttached>
  <shadedClassifierName>launcher</shadedClassifierName>
</configuration>

请注意,使用此配置时,阴影 JAR 将不会替换主 JAR。shadedArtifactAttached https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadedArtifactAttached被设定为true,这意味着阴影 JAR 将作为辅助工件附加到项目中。它将与主 JAR 区分开来,其分类器为launcher,即shadedClassifierName https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadedClassifierName范围。

运行后mvn clean package在此项目中,您将创建 2 个 JAR:

  • mavenproject1-1.0-SNAPSHOT.jar,这是主要的 JAR。该 JAR 仅包含应用程序的已编译 Java 源代码。它不可执行,并且不包含所有依赖项的类。
  • mavenproject1-1.0-SNAPSHOT-launcher.jar是阴影附加的 JAR,它是由 Shade 插件构建的。这个是可执行的并且包含依赖项的类。

这意味着如果您想将应用程序作为可执行 JAR 启动,则必须启动-launcher.jar,而不是另一个,与

java -jar mavenproject1-1.0-SNAPSHOT-launcher.jar

顺便说一句,这两个 JAR 都将包含位于<directory>src/main/java/resources</directory>,因为它们是项目本身的资源,正如声明的那样<resource>元素。然而,最好尊重标准目录布局 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html并将资源放入src/main/resources反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven:使用指定主类和属性文件的shade-plugin编译项目 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 需要有关上下文菜单的建议

    我有一个 XML 布局 其中有两个编辑文本字段 一个用于 标题 另一个用于 故事 当用户在这些文本字段中输入数据并按后退按钮时 该条目将作为标题集保存在列表视图中 列表视图出现在 A1 活动中 现在A1扩展了Activity 每当 长按 列
  • 使用堆属性按排序顺序打印树 (Cormen)

    我对算法理论 来自 Cormen 感到耳目一新 二进制尝试一章中有一个练习 要求 min heap 属性可以用来打印 n 节点的键吗 树在 O n 时间内排序 展示如何做 或解释为什么不做 我想是的 这是可能的 在最小堆中 节点中的元素小于
  • cesium:如何在Cesium中设置不同形状的Z-index?

    如何在Cesium中设置不同形状的Z index 请参阅下面的屏幕截图 我希望圆柱体内的广告牌图标显示在圆柱体上 提前致谢 这并不容易 因为您的圆柱体是实际的 3D 体积 并且您的广告牌位于其中 3D 渲染引擎中没有 CSS 样式的 Z 索
  • 如何以编程方式证明“六度分离”概念?

    我有一个包含 2000 万用户以及这些人之间的联系的数据库 如何证明 六度分离 的概念以最有效的方式在编程中 链接到有关六度分离的文章 http en wikipedia org wiki Six degrees of separation
  • 如何从 ModelState 键中删除前缀?

    例如 有一个Web Api操作方法 public HttpMessageResponse Post UserDto userDto if this ModelState IsValid return this Request CreateE
  • 当替换器使用变量时,如何调用 Regex::replace_all?

    对于下面的代码 我尝试输出输入单词 后跟随机字符串 第一个函数可以编译 但我不想要它 因为它不使用随机字符串 第二个函数会产生编译器错误 我如何解决它 use regex Regex fn main let cd rust ok but i
  • Python 中的数字列表求和[重复]

    这个问题在这里已经有答案了 给定一个数字列表 例如 1 2 3 4 5 我如何计算它们的总和 1 2 3 4 5 我如何计算它们的成对平均值 1 2 2 2 3 2 3 4 2 4 5 2 问题一 要对数字列表求和 请使用sum https
  • 任务返回类型出错 - “x 有错误的返回类型”

    我有一行代码 即 bool stop await Task
  • 如何在 RxJS 中通过 ID 去抖

    我的问题是下一个 我想取消我的应用程序的点赞功能 我使用操作在我的应用程序中进行更改 例如 dispatch likePost 1 gt dispatch type LIKE POST id 1 给出下一个例子 我在时间 0 发送一个操作
  • RabbitMQ Java 客户端自动重新连接

    当我的应用程序失去与 RabbitMQ 的连接时 我将其连接工厂设置为自动尝试并重新连接 ConnectionFactory factory new ConnectionFactory factory setUsername usernam
  • 为什么调用 parseInt 时需要使用基数参数?

    基数实际上意味着什么 为什么我们需要它 parseInt 10 radixValue 您可能并不总是希望将整数解析为以 10 为基数的数字 因此提供基数允许您指定其他数字系统 基数是单个数字的值的数量 十六进制为 16 八进制为 8 二进制
  • 合并 pandas 数据框中两列的连续日期

    ID Order ID statr date end date Product Sub Product 746 001 08 Oct 2019 0 00 00 16 Nov 2019 0 00 00 LPP Abc 746 002 10 O
  • 文本框中的逗号

    我想得到你的帮助来解决这个问题 当我创建一个文本框并输入 时重点是 我希望它出现 逗号 我已经尝试过使用 textBox Text Replace 但它不起作用 更多建议 先感谢您 protected void TextBox1 TextC
  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe
  • 编译器优化导致性能下降

    我有一个奇怪的问题 我有以下代码 template
  • 为什么 C# 不能使用内联匿名 lambda 或委托? [复制]

    这个问题在这里已经有答案了 我希望我的问题标题措辞恰当 在 C 中 我可以使用 lambda 作为委托 或旧的委托语法来执行此操作 Func
  • 使用回调方法将 JavaScript 函数转换为类

    我正在尝试将以下函数转换为 JavaScript 中的类 原始函数来自CMS https stackoverflow com users 5445 cms已创建here https stackoverflow com a 1192001 1
  • 是否可以将继承应用于 Singleton 类?

    今天面试时遇到一个问题 是否可以在单例类上应用继承概念 我说过 由于构造函数是私有的 因此我们无法扩展该 Singleton 类 他问我的下一件事是在该 Singleton 类上应用继承 因此 我将单例的构造函数设置为受保护的 认为孩子的构
  • 如何在不执行脚本并生成任何类文件的情况下检查 Scala 脚本的语法?

    人们可以用 Scala 编写脚本 所以你可以把它放入Hello scala bin sh exec scala 0 println You supplied args length arguments 并使其在 Unix 中可执行 chmo
  • Maven:使用指定主类和属性文件的shade-plugin编译项目

    刚接触 Maven 我试图使用 Maven 和 maven shade plugin 来编译一个项目 因为它似乎是构建 fat jar 的最佳插件 我尝试指定我的主类来制作可运行的 jar 文件和一些包含翻译字符串的 properties