怎样在jar格式的压缩包中添加文件,我每次添加文件进去,他都会提示要重新压缩成一个压缩包,而不是直

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样在jar格式的压缩包中添加文件,我每次添加文件进去,他都会提示要重新压缩成一个压缩包,而不是直相关的知识,希望对你有一定的参考价值。

怎样在jar格式的压缩包中添加文件,我每次添加文件进去,他都会提示要重新压缩成一个压缩包,而不是直接添加到该压缩包中,而那个重新压缩的压缩包又没有jar格式的,怎么办

您好,JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可
jar 命令的用法如下:

  jar ctxu[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...

  其中 ctxu 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:

  -c 创建新的 JAR 文件包
  -t 列出 JAR 文件包的内容列表
  -x 展开 JAR 文件包的指定文件或者所有文件
  -u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)

  [vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数

  -v 生成详细报告并打印到标准输出
  -f 指定 JAR 文件名,通常这个参数是必须的
  -m 指定需要包含的 MANIFEST 清单文件
  -0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快
  -M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数

  [jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数
  [manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数。追问

看不懂……met什么的那个是万能的吗

参考技术A 你可以在Eclipse里打包之前,选择你需要的文件进去的追问

eclipse是啥

本回答被提问者采纳

怎样获得在yarn框架上运行jar包的执行结果

1、打开Spring Boot应用,通过Maven命令package命令将应用打成jar包。

2、执行命令java -jar xx.jar启动Spring Boot应用,输入jsp页面对应的Url映射后,可以看到页面未找到。

3、用解压缩软件将jar包打开,可以看到jar包中并没有对应的webapps目录,所以上面报了页面未找到错误。

4、在pom文件的build节点下添加resource配置,目的是将webapps下的目录打包到jar文件的META-INF\\resources目录下。

5、再次执行package打包命令将应用打成war包,这次可以注意到jar包中META-INF\\resources目录下包含了webapps下的所有文件。

参考技术A 配置方法
(1) 首先需要确保spark在1.1.0以上的版本。
(2) 在HDFS上建立一个公共lib库,比如/system/spark-lib/,设置权限为755。把spark-assembly-*.jar上传到公共lib库中。
(3) 在spark-env.sh中配置:

view plaincopy to clipboardprint?
<span style="font-size:14px;">spark.yarn.jar hdfs://yarncluster/system/spark_lib/spark-assembly-1.1.0-hadoop2.3.0-cdh5.1.0.jarspark.yarn.preserve.staging.files false</span>

**spark.yarn.jar配置成HDFS上的公共lib库中的jar包。这个配置项会使提交job时,不是从本地上传spark-assembly*.jar包,而是从HDFS的一个目录复制到另一个目录(不确定HDFS上的复制是怎么操作的),总的来说节省了一点时间。(网上有的文章里说,这里的配置,会节省掉上传jar包的步骤,其实是不对的,只是把从本地上传的步骤改成了在HDFS上的复制操作。)
**spark.yarn.preserve.staging.files: 这个配置项配置成false,表示在执行结束后,不保留staging files,也就是两个jar包。然后HDFS上的.sparkStaging下的两个jar包在作业执行完成后就会被删除。如果配置成true,执行完后HDFS上的.sparkStaging下两个jar包都会保存下来。
然后再运行,发现HDFS上.sparkStaging目录下不会再保留jar包。
问题定位
按道理来说,因为spark.yarn.preserve.staging.files默认是false,所以HDFS上的jar包是不会被保留的。但是在spark1.0.2中,却没有删除。我看了下1.0.2的代码,删除的机制是存在的:
//yarn/alpha/src/main/scala/org/apache/spark/deploy/yarn/ApplicationMaster.scala

view plaincopy to clipboardprint?
<span style="font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:12px;"> /** * Clean up the staging directory. */ private def cleanupStagingDir() var stagingDirPath: Path = null try val preserveFiles = sparkConf.get("spark.yarn.preserve.staging.files", "false").toBoolean if (!preserveFiles) stagingDirPath = new Path(System.getenv("SPARK_YARN_STAGING_DIR")) if (stagingDirPath == null) logError("Staging directory is null") return logInfo("Deleting staging directory " + stagingDirPath) fs.delete(stagingDirPath, true) catch case ioe: IOException => logError("Failed to cleanup staging dir " + stagingDirPath, ioe) </span></span>
按照这个逻辑,默认在AM关闭的时候,是会删除HDFS上的jar包的。不过没有正常删除。推测这应该是一个1.0.2里面的bug,而在1.1.0里面已经修复。

nodemanager节点上的jar包缓存
升级到1.1.0版本后,HDFS上的jar包问题就解决了。但是nodemanager节点上的jar包还是会保留。这个问题的定位很纠结,不过结果却出乎意料的简单。不说了,上结果吧。
配置方法
(1) 配置yarn-site.xml:
<span style="font-family:Microsoft YaHei;font-size:12px;"> <property>
<name>yarn.nodemanager.local-dirs</name>
<value>local-dir1, local-dir2,local-dir3</value>
</property>
<property>
<name>yarn.nodemanager.localizer.cache.target-size-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name>
<value>1800000</value>
</property></span>
**yarn.nodemanager.local-dirs: 这个目录是nodemanager上的作业中间数据存放路径。推荐配置多个盘上的多个路径,从而分散作业执行中的磁盘IO压力。
**yarn.nodemanager.localizer.cache.target-size-mb:配置nodemanager上的缓存目录的最大限度。nodemanager上有一个deletion server服务,会定期检测,如果yarn.nodemanager.local-dirs中配置的目录大小(如果配置了多个,则计算多个目录的总大小)是否超过了这里设置的最大限度值。如果超过了,就删除一些已经执行完的container的缓存数据。
因为spark提交作业后遗留在nodemanager上的jar包就在yarn.nodemanager.local-dirs下面,所以只要这里配置合适的大小值。那么nodemanager上的deletion server是会自动检测并保证目录总大小的。所以只要配置了这个量,我们就不需要再担心nodemanager上的jar包缓存问题了,交给yarn就好了!很简单啊有木有,可就这么个问题,居然花了我一个星期的时间去定位。
**yarn.nodemanager.localizer.cache.cleanup.interval-ms: deletion server多长时间做一次检测,并且清除缓存目录直到目录大小低于target-size-mb的配置。
通过上面这三个量的配置,nodemanager会确保本地的缓存数据总量在target-size-mb之下,也就是超过了的话,之前的spark的jar包就会被删除。所以我们就不需要再担心nodemanager节点上的spark jar包缓存问题了。不过target-size-mb的默认值是10G,这个值当然可以根据你的实际情况进行调整。

以上是关于怎样在jar格式的压缩包中添加文件,我每次添加文件进去,他都会提示要重新压缩成一个压缩包,而不是直的主要内容,如果未能解决你的问题,请参考以下文章

怎么修改jar包中的class文件然后再重新打成jar包

打包的jar 替换或修改文件

如何在压缩包里添加文件

怎样获得在yarn框架上运行jar包的执行结果

怎样获得在yarn框架上运行jar包的执行结果

怎样打开.jar格式文件,怎样运行.jar格式文件