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编译项目 的相关文章

  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

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

    我有一个 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