如何阻止 maven-shade-plugin 阻止 java.util.ServiceLoader 初始化 opensaml-impl 类型

2024-01-03

使用 OpenSAML 3 时,您必须首先从opensaml-saml-impl具有以下代码行的工件:

InitializationService.initialize();

This uses java.util.ServiceLoader加载任何实现的类型Initializer https://wiki.shibboleth.net/confluence/display/OS30/Initialization+and+Configuration.

当我编写测试并运行它时mvn integration-test,这工作正常,我可以看到一切都已加载:

Assert.assertTrue(
    XMLObjectProviderRegistrySupport
        .getUnmarshallerFactory()
        .getUnmarshallers()
        .size() > 400);

但是,我的项目使用maven-shade-plugin。上面的条件是nottrue 如果我将代码打包到 uber-jar 中:

mvn package
java -jar /path/to/my.jar

在这种情况下,我观​​察到只有 9 个解组器已加载(那些在opensaml-core,与那些在opensaml-saml-impl。但是,当我观看输出时mvn package,我可以看到类型are包含在阴影罐子中:

[INFO] Including org.opensaml:opensaml-saml-impl:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-profile-api:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-messaging-api:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-saml-api:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-xmlsec-api:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-soap-api:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-storage-api:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-security-impl:jar:3.2.0 in the shaded jar.
[INFO] Including org.opensaml:opensaml-security-api:jar:3.2.0 in the shaded jar.

我可以使用以下愚蠢的代码解决这个问题:

private static void initManuallyInsteadOfWithInitializationServiceSoThatMavenShadePluginDoesNotRemoveThem() throws InitializationException {
    new ApacheXMLSecurityInitializer().init();
    new ClientTLSValidationConfiguratonInitializer().init();
    new GlobalAlgorithmRegistryInitializer().init();
    new GlobalParserPoolInitializer().init();
    new GlobalSecurityConfigurationInitializer().init();
    new JavaCryptoValidationInitializer().init();
    new SAMLConfigurationInitializer().init();
    new org.opensaml.core.xml.config.XMLObjectProviderInitializer().init();
    new org.opensaml.xmlsec.config.XMLObjectProviderInitializer().init();
    new XMLObjectProviderInitializer().init();
}

这完全违背了插件系统的意义,但它确实允许我的程序运行。

作为参考,这里是相关部分pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <manifestEntries>
                            <Main-Class>com.example.Server</Main-Class>
                        </manifestEntries>
                    </transformer>
                    <transformer
                            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
                    </transformer>
                </transformers>
                <artifactSet>
                </artifactSet>
                <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar
                </outputFile>
                <filters>
                    <filter>
                        <!-- Fix java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
                             when server starts inside Docker container due to inclusion of OpenSAML and use of
                             uber-jar / maven-shade-plugin. See http://stackoverflow.com/a/6743609 -->
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                    <filter>
                        <!-- This was one of my attempts to fix the problem.
                             Unfortunately, it doesn't work. -->
                        <artifact>org.opensaml:opensaml-saml-impl</artifact>
                        <includes>
                            <include>**</include>
                        </includes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

当您使用带有依赖项的 Maven Shade 插件时ServiceLoaderAPI,您应该使用ServicesResourceTransformer https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer,专门用于将文件合并在一起。如果插件是搬迁班级 https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html,它还会正确地重新定位每个服务文件中的类名,这与AppendingTransformer.

所以你只需更换当前的AppendingTransformer with

<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>

它将确保下的每个服务文件META-INF/services您的依赖项将被合并,无需全部声明。

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

如何阻止 maven-shade-plugin 阻止 java.util.ServiceLoader 初始化 opensaml-impl 类型 的相关文章

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

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • CommandEventArgs 和事件问题

    我生成了一些按钮 并为它们附加了一个事件处理程序 如下所示 Button pgs new Button Create New Topic pgs Width 20 pgs Command obtainTopicsPerPage Click
  • 如何在 Git bash 中更改 git 帐户?

    我在使用 Git bash 时遇到了奇怪的问题 比方说 我有两个 Github 帐户A and B 我设置了我的姓名和电子邮件 就像在帐户 A 中一样 git config global user name git config globa
  • 应用过滤器' aria-label='HTML 应用过滤器'> HTML 应用过滤器

  • 多个标头导致metadataHeaders选项失败

    这是我的代码片段 if messages messages for message in messages messages batch add gmail client users messages get userId me id me
  • iPad 相机连接套件?

    有谁知道是否可以访问iPad的相机连接套件 我想从连接的大容量存储设备中读取文件 这可能吗 或者只有苹果才能在他们的应用程序中做到这一点 Thanks 我知道这是一个老问题 但谷歌把我带到这里 所以我想我应该添加这个链接 http www
  • 带有选项参数的短/长选项 - 这是某种约定吗? [复制]

    这个问题在这里已经有答案了 似乎大多数 很多 命令都实现这样的选项参数 如果短选项需要选项参数 则选项与选项参数之间用空格分隔 例如 head n 10 如果长选项需要选项参数 则选项由 来自选项参数 例如 head lines 10 这是
  • 如何在 Excel 中创建时间线图表?

    我如何创建一个timeline聊天可以在一张图表中直观地显示人们一天的活动 我计划在 x 轴上放置时间 y 轴将是不同的人 首先 我想到了一个简单的堆积条形图 但是 那问题是 Excel 会将所有相同的活动合并到一个项目中并且不要在时间轴上
  • 使用 OR 而不是 AND 链接/构建 LINQ 查询

    编辑得更清楚 例如 如果我有这个 IQueryable DateTime theDate new DateTime 2015 09 30 var query from org in Organisations where org Disab
  • ASP.Net 中的自定义主体缓存

    我在 ASP NET 中成功使用了自定义主体 但我的自定义主体加载数据库数据 并且我不希望在系统中的每个请求上都发生这种情况 我在 Application OnPostAuthenticateRequest 的 Global ascx 文件
  • 如何在应用程序中访问 iPhone Safari 历史记录?

    有什么方法可以访问 iPhone Safari 的历史记录吗 问候 克里希南 不 这些应用程序是沙盒的并且彼此隔离 您无法从一个应用程序读取另一应用程序的数据 它是安全模型的一部分 您想要一些随机应用程序来浏览您的冲浪历史吗
  • 最新材料设计版本中的渲染问题“Path.op() 不受支持”[重复]

    这个问题在这里已经有答案了 我在下面使用androidx in 安卓工作室3 5 3 androidx recyclerview widget RecyclerView com google android material floatin
  • Spark 提交 java.lang.IllegalArgumentException:无法从空字符串创建路径

    当我执行 Spark 提交时 我收到此错误 java lang IllegalArgumentException 无法从空字符串创建路径 我使用的是spark版本2 4 7 hadoop版本3 3 0 集成开发环境 JDK 8 首先我遇到了
  • 如何查明谁在托管我的 WordPress 网站? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在接管一家公司的 WordPress 网站 他们不知道谁目前正在托管他们的 WordPress 网站 他们拥有的只是域名托管商和 Wo
  • 如何在react-router中设置和处理语言?

    我一整天都在努力解决这个问题 终于找到了大家 任务很简单 我需要在 URL 中设置语言类型 所以它看起来像这样 domain com langVar other paths 并且能够通过单击 选择我的应用程序标题或任何其他组件中的语言来更改
  • 扩展模型未加载

    我们有一个 Magento 开发站点和一个生产站点 这两个网站都安装了名为 Affiliate Pro 的扩展 我需要从我的脚本访问模型 所以我写了一个测试脚本 它适用于我们的开发站点 但不适用于生产站点 开发站点输出 object MW
  • 我可以更改 gdb 中 RET 的绑定吗?

    我想禁用 gdb 行为 即输入回车符会重复执行最后输入的命令 我只是想让它什么也不做 这可能吗 似乎重复大多数命令是 gdb 的默认行为 并且没有设置可以更改它 这是 gdb 源代码中的样子 Handle a complete line o
  • Libreoffice Draw Export解析没有意义

    我正在尝试使用 Libreoffice Draw v 4 0 2 2 制作一个非常简单的标签 该标签只不过是规则间隔的居中文本行而已 该图像将被打印 并且我有固定的尺寸 ppi 要求以确保适当的打印质量 我根据自己的规格设置页面大小 并根据
  • ES6 默认导出和命名导出

    我试图理解命名和默认导出 我有一个看似基本的要求 但我不明白如何设置 我希望能够导入两者 app js import Mod from my module import funcA funcB from my module console
  • DRF 序列化器深度使创建时忽略字段

    github上有这个问题的项目 https github com sam moshenko drf depth problem 由于某种原因 序列化器的深度选项会使字段在创建时被忽略 序列化器 class AnswerSerializer
  • 如何阻止 maven-shade-plugin 阻止 java.util.ServiceLoader 初始化 opensaml-impl 类型

    使用 OpenSAML 3 时 您必须首先从opensaml saml impl具有以下代码行的工件 InitializationService initialize This uses java util ServiceLoader加载任