一种常见的maven打包后同名文件冲突错误

在使用一些开源框架的时候(比如spark、hadoop、lucene等),偶尔会见到说找不到某个具体实现类或者某个配置(比如spark的akka配置)不见了。

部分例子如下:

【Lucene】An SPI class of type org.apache.lucene.codecs.PostingsFormat with name ‘Lucene50‘ does not exist.  You need to add the corresponding JAR file supporting this SPI to your classpath.  The current classpath supports the following names: [es090, completion090, XBloomFilter]

【Hadoop】An exception occured while performing the indexing job : java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.

小部分情况下,可能确实是配置问题或依赖问题没解决好,所以第一步是检查依赖或配置,比如上面的mapreduce错误,首先检查yarn-site.xml的相应framework配置是不是为yarn。如果配置或依赖确认已经打包进去了,那么本质上其实是打包时同名文件被覆盖的原因,尤其是maven assembly/shade常会遇见此类问题。

现象:其实配置是对的存在的,但是被覆盖了;其实spi类是指定了的,但是manifest被覆盖了。

解决办法:先从报错的源码或配置等去定位,查看打包后jar里实际的配置或manifest是什么,根据实际情况使用shade插件打包并添加transform。

一个我常用的shade插件的示例

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>reference.conf</resource>
                </transformer>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
                <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>
              <shadedArtifactAttached>true</shadedArtifactAttached>
              <shadedClassifierName>jar-with-dependencies</shadedClassifierName>
            </configuration>
          </execution>
        </executions>
      </plugin>

其中Appending那里的reference.conf是专门解决spark reference.conf文件同名导致akka配置被覆盖的,另外两个Manifest和Service是解决es、lucene的manifest配置备覆盖的。其实这一类transform的解决文件冲突思路是把多个同名的根据一定规则拼成一个,比如manifest文件只拼接内容、Appending则是直接追加等。

时间: 2024-11-09 15:25:18

一种常见的maven打包后同名文件冲突错误的相关文章

webpack打包后iconfont文件路径问题解决

在使用vue-cli创建vue项目时,可以自动生成webpack文件.使用 npm run build 即可打包发布生产文件,打包后的文件 可以看到使用url-loader处理后的文件是在static目录下生成fonts目录下的文件.全部样式文件打包在css目录下app.hash.css文件中. 但我们会发现发布后,会存在字体文件找不到的问题,查看css文件发现是iconfont字体文件的路径引用问题. 解决方法: 在build/utils文件中的下图所示位置添加../../公共路径 这样打包的

webpack4+(打包后的文件分析+HTML插件+样式处理)

(1)打包后的文件分析 首先将打包后的文件进行适当删减,Ctrl+Shift+L可以同时选中所有相同结构内容 结构如下 (function(modules){ ... })( { ... } ) 分析可知本质为匿名函数即IIFE函数,执行时会传入后面函数执行符里的对象,接下来分析下传入对象 key指的是当前模块路径 value (2)HTML插件 (3)样式处理 . 原文地址:https://www.cnblogs.com/jianxian/p/12416586.html

Maven打包成Jar文件时依赖包的问题

我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用.我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入第三方jar包后,在Idea中进行相应设置后,可以调试运行了,但是用Docker打包上传到服务器后,运行时会提示找不到某些类的定义. 经查看这些找不到的类就是来自第三方库,那么问题有可能是第三方jar包的路径问题,或者是根本就没有打包进jar文件里面.我们可以去Docker容器内部查看jar文件,执

MAVEN打包丢失xml文件解决办法

MAVEN打包默认只包含src/main/java下的class文件,如果需要包含xml.properties等文件,请在build节点下面添加如下代码 <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</in

8、Maven打包时resources文件夹下的资源文件没有打进去的解决措施

场景:使用maven install进行打包时,发现resources文件夹下的资源文件没有打进去,war中展示的还是修改前的原文件,解决措施如下: 1.在pom.xml文件中,在<build>打包标签中增加resources标签配置,指定maven将resources资源文件进行打包: 原文地址:https://www.cnblogs.com/wf2010517141/p/10451182.html

要命系列-运行vue打包后的文件

如何运行打包后的dist文件看看效果,比如路径什么的有没有问题之类的,那就需要在部署前看看页面有没有崩坏. 废话不多说,看图(ps本人用的是vue-cli4) 首先npm install -g serve(全局安装),如果你网速不大好,用淘宝镜像cnpm安装也可以 再来就是在这一级目录下直接serve -s dist 就可以了 然后就可以了~ 是不是觉得很简单很假,,其实这就是不啃vue文档的后果,度娘一搜前几页基本都是安装express-generator生成器什么的~太可怕了..刚弄完vue

create-react-app 打包后静态文件过大 webpack优化

在最近的项目里,页面和静态文件并不是很多的情况下,打包后发现产出的静态资源却很大. 1.关掉sourcemap 在config/webpack.config.js文件里,大概30几行的位置添加这样一句代码,这样做的作用是防止线上生成环境将源码一起打包部署. 2.将一些公共的库(比如antd)做一个缓存 splitChunks: { chunks: 'all', name: "vender", cacheGroups: { vender: { name: "vendor&quo

解决: PyInstaller打包后exe文件打开时出现failed to execute script

def resource_path(self, relative): if hasattr(sys, "_MEIPASS"): return os.path.join(sys._MEIPASS, relative) return os.path.join(relative) def copy_GUI(self): root = tkinter.Tk() root.title("U盘拷贝小工具 v6.0") root.geometry("400x260&qu

maven打包后项目名称不对

昨晚打包一个刚开发好的毕业设计项目,然后启动tomact发现老是报404.排查了才发现原来是打包之后的项目名称带有版本号,如图: 网上看了一些类似的问题,说的web.xml没有配对,但其实不然,我重新创建了一个新的maven项目,然后进行打包,发现并不会有这个问题,对比pom.xml才发现原来少了 <build> <finalName>cms</finalName> </build> 加上这句就可以自定义project的名称了.