序:在开发storm项目时,提交项目jar包当把依赖的第三方jar包都打进去提交storm集群启动时报了发现多个同名的文件错误由此开始了一段对jar包的深刻理解之路。
java.lang.RuntimeException: Found multiple defaults.yaml resources.
You're probably bundling the Storm jars with your topology jar.
[jar:file:/home/hadoop/app/storm/lib/storm-core-0.9.6.jar!/defaults.yaml,
jar:file:/home/hadoop/stormApi-wordcount-1.0-SNAPSHOT-jar-with-dependencies.jar!/defaults.yaml]

这里说明stom集群环境中有storm的jar包,我们提交的jar包里面也包含storm的jar包,在读取配置文件时,发现有一样的文件冲突了导致启动错误。

新浪微博:intsmaze刘洋洋哥

eclipse打jar包
代码如下:
package cn.intsmaze;
public class A {
public static void main(String[] args) {
System.out.println(args[0]);
System.out.println("java工程打jar包");
}
}package cn.intsmaze;
import java.util.HashMap;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class demo {
public static void main(String[] args)
{
System.out.println("java工程调用第三方jar包");
Jedis jedis = new Jedis("localhost", 6379);
Map map=new HashMap();
map.put("11", "1");
d.jedis.hmset("33", map);
d.jedis.close();
}
}

上面的代码的java工程如下:
使用eclipse把该工程打包成jar包:
选择这个jar包的入口类

把上面代码打包为A.jar后,eclipse会自动为我们生成下面这个文件位于META-INF:
MANIFEST.MF文件
Manifest-Version: 1.0
Main-Class: cn.intsmaze.A   这里指定入口类

把上面代码打包为B.jar
MANIFEST.MF文件
Manifest-Version: 1.0
Main-Class: cn.intsmaze.demo  这里指定入口类

因为这里引用了工程lib下面第三方的jar包,但是该jar包并不在classpath路径下面,所有就没有找到该类。
在MANIFEST.MF文件增加calsspath值即可。
Manifest-Version: 1.0
Main-Class: cn.intsmaze.demo
Class-Path: lib/jedis-2.8.0.jar 

然后我们把jedis-2.8.0.jar放到我们B.jar的同一级目录下即可。
这里成功运行了。
注意:
manifest.mf文件定义如下所示:
Manifest-Version: 1.0
Main-Class: com.Task
Class-Path: lib/dom4j-1.6.1.jar lib/jaxen-1.1-beta-7.jar
注意:
<1> manifest.mf文件最后一行必须是一个空行。
<2> lib/dom4j-1.6.1.jar和lib/jaxen-1.1-beta-7.jar之间用一个空格隔开。
<3>每个冒号后有一个空格。

Maven打包:
代码如下:
package cn.intsmaze;
public class A {
public static void main(String[] args) {
System.out.println(args[0]);
System.out.println("java工程打jar包");
}
}package cn.intsmaze;
import java.util.HashMap;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class demo {
public static void main(String[] args)
{
System.out.println("java工程调用第三方jar包");
Jedis jedis = new Jedis("localhost", 6379);
Map map=new HashMap();
map.put("11", "1");
d.jedis.hmset("33", map);
d.jedis.close();
}
}

如上代码当他们的pom文件中只配置了以下属性时:
 <dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>

这个时候使用maven打包。观察他的目录结构。

这个jar包里面没有包含依赖的jedis的jar包,且manifest.mf文件中也没有指定入口类和Class-Path(该程序到哪里去加载它依赖的jedis.jar包)。
如果要成功运行这个jar包,我们要在manifest.mf设置Main-Class和Class-Path。
方式二:我们可以在pom文件中设置把工程打jar包时把它依赖的jar包也打进来,同时指定Main-Class。
 <build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>cn.intsmaze.demo.RedisDemo</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>

观察他的目录结构。

同时也会打一个没有带依赖的jar包(效果就和没添加插件设置一样)
在打包storm工程时的问题:
 <dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.5</version>
</dependency>
</dependencies>

这个项目只会依赖jdk的jar包和storm的jar包,不依赖其他第三方jar包,我们把这个工程打出jar包,根据上面很明显我们知道jar包中不包含依赖的storm的jar包,且manifest.mf文件中也没有指定Main-Class和Class-Path。

但是把它提交到storm集群中,它是会运行的,这是因为stom集群的Class-Path的路径有jdk和storm的jar包了(我们使用java -jar命令就是jdk什么的。)。关于Class-Path我可以理解的,但是没有指定入口类,它是怎么启动的,我还要慢慢研究。
当上面的storm工程需要依赖第三方的mysql包时,我们必须在pom文件中要求把依赖的jar包打进来,不然我们要在manifest.mf指明它要到哪里去加载依赖的mysql包,同时还要把mysql包上传到我们打的jar包将要运行在那台机器上的指定目录让他可以根据Class-Path加载进去。
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>cn.intsmaze.helloworld.WordCountTopologyMain</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>

这里把依赖的第三方jar包都打进去了。
但是我们提交该jar包到storm集群中,报了如下错误:
java.lang.RuntimeException: Found multiple defaults.yaml resources.
You're probably bundling the Storm jars with your topology jar.
[jar:file:/home/hadoop/app/storm/lib/storm-core-0.9.6.jar!/defaults.yaml,
jar:file:/home/hadoop/stormApi-wordcount-1.0-SNAPSHOT-jar-with-dependencies.jar!/defaults.yaml]

这里说明stom集群环境中有storm的jar包,我们提交的jar包里面也包含storm的jar包,在读取配置文件时,发现有一样的文件冲突了导致启动错误。

这个时候我们设置如下:
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<scope>provided</scope>期望JDK、容器或使用者会提供这个依赖
<version>0.9.5</version>
</dependency>

这个时候不会把依赖的storm的包打进工程中,只会把依赖的mysql包打进来。

转载于:https://www.cnblogs.com/intsmaze/p/5998646.html

由提交storm项目jar包引发对jar的原理的探索相关推荐

  1. 关于web项目引入jstl.jar包和standard.jar包后存在的问题

    项目场景: 自我研究jstl中 问题描述 导入jstl.jar包和standard.jar包,并且添加为库,在jsp文件中也写了引入代码 <%--引入标签库--%> <%@ tagl ...

  2. java调用jar并传参,Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参

    Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...

  3. Java项目打成Jar包后执行Jar包指定方法

    最近在考虑跳个槽的问题,也看了几个面试,其中有一个面试让我本地写一个蛇形矩阵,打成Jar包,并且可以使用java -jar 命令启动,本人基础不太牢固,这个问题我找了半天才找到解决的办法,面试题答完直 ...

  4. java jar包资源文件_深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

  5. IntelliJ IDEA for Mac如何添加jar包/如何导入jar包/导包

    文章目录 如何将 jar 包添加到已存在的资源库中 将 jar 包添加到项目级别的资源库中 将 jar 包添加到全局级别的资源库中 将 jar 包添加到模块级别的资源库中 创建资源库 创建模块级别的资 ...

  6. [Java基础] 深入jar包:从jar包中读取资源文件

    转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的 ...

  7. spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解

    spring jar 包详解 spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环 ...

  8. 深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

  9. 使用jar命令替换jar包中的jar文件

    替换jar包中的jar文件(一般jar不会压缩使用-0表示不压缩) 1. 根据文件名,查询出文件目录 jar -tvf xxxx.jar | grep jdbc.jar 2. 将需要修改的文件,解压出 ...

最新文章

  1. 2019 半导体领袖新年展望(一)| 半导体行业观察
  2. python安装文件乱码_python输出到文件乱码如何解决
  3. AssetBundle系列——共享资源打包/依赖资源打包
  4. LiveVideoStack上海2019八折截止最后一周
  5. 命令执行——命令执行漏洞及(四)
  6. Live Migrate 操作 - 每天5分钟玩转 OpenStack(42)
  7. camunda 流程执行追踪_流程引擎为什么选 Camunda
  8. scott用户对象维护
  9. MMKV_Android数据持久化方案调研-MMKV SP REALM ROOM WCDB...
  10. 计算机网络课程思政教学目标,计算机学院举行课程思政示范教学活动
  11. ThreeJS的性能优化方面
  12. 【python初学者日记】输入年份:判断是否闰年:闰年:yyyy是闰年,这年有366天;yyyy是平年,这年有365天
  13. PHP 大数据处理思路
  14. lowB三人组---冒泡排序原理和实现
  15. flvplayer.swf flv视频播放器使用方法
  16. 实现条码枪的无焦点扫码
  17. 用Qt搭建图书管理系统(三)
  18. 架构师小跟班:SSL证书免费申请及部署,解决页面样式错乱问题
  19. BuildAdmin后台管理系统入门分析:01
  20. linux tail命令语法

热门文章

  1. 计算机怎么开机操作,计算机是如何启动的?从未上电到操作系统启动
  2. G=(V,E)是什么意思
  3. Error Message:网络连接错误,详细信息:Connection pool shut down
  4. HDU-2224-The shortest path
  5. java 最烧脑的继承题_java烧脑面试题总结
  6. 网页转换成markdown
  7. PMP考后需要做什么?考生须知
  8. hexo博客主题推荐
  9. linux svn e170001,jenkins - svn: E170001报错的原因以及解决方案
  10. 神同步的智能运维体系和世界杯442阵型