交java jar 设置参数作业交成jar包了怎么办

西西软件下载最安全的下载网站、值得信赖的软件下载站!
→ 如何打jar包、两种方法轻松搞定
类型:反编译(译逆工程)大小:11.9M语言:中文 评分:5.0
jar文件是java开发的一种zip格式的打包,JAR 文件不仅是一个包,还可以是可执行程序、电子书、插件等,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。1.在dos下面打包jar文件&D:\jdk1.5.0_07\bin& jar& /help&用法:jar& {ctxu}[vfm0Mi]& [jar-文件]& [manifest-文件]& [-C& 目录]& 文件名& ...&选项:&-c& 创建新的存档&-t& 列出存档内容的列表&-x& 展开存档中的命名的(或所有的〕文件&-u& 更新已存在的存档&-v& 生成详细输出到标准输出上&-f& 指定存档文件名&-m& 包含来自标明文件的标明信息&-0& 只存储方式;未用ZIP压缩格式&-M& 不产生所有项的清单(manifest〕文件&-i& 为指定的jar文件产生索引信息&-C& 改变到指定的目录,&在命令行中运行刚刚生成的jar,命令如下:&java -jar .jar&如果在jar中有一些System.out.prinln语句,运行后想看看打印出的内容,可以用一下命令:&java -jar test.jar &log.txt&输出信息会被打印到log.txt中,当然log.txt自动生成,并位于和test.jar一个目录中。&这里也可以新建一个start.bat文件,创建后;右键---编辑,输入:java -jar test.jar &log.txt;以后直接双击start.bat即可运行test.jar啦。&注意,如果你是在文件导出放在如:E盘,则你需要导入得包也要放在这个目录里。&如果一个文件名是一个目录,它将被递归处理。&清单(manifest〕文件名和存档文件名都需要被指定,按 'm '& 和& 'f '标志指定的相同顺序。示例1:将两个class文件存档到一个名为& 'classes.jar '& 的存档文件中:&jar& cvf& classes.jar& Foo.class& Bar.class&示例2:用一个存在的清单(manifest)文件& 'mymanifest '& 将& foo/& 目录下的所有&文件存档到一个名为& 'classes.jar '& 的存档文件中:&jar& cvfm& classes.jar& mymanifest& -C& foo/& .&2.用eclie打包jar文件&通过导出的方式(右键单击项目,之后选择Export)打包java类文件生成jar包。方法一:(在项目工程没有引用外部jar包时,直接导出)&选中工程----&右键,Export...---&Java---&JAR file---&next--&选择jar file的路径及名称--&next--&next---& 选择main class---&finish.&方法2:&当工程引用了其他的外部jar时,由于eclipse不支持同时导出外部jar包的功能,所以比较麻烦一点;具体步骤如下:&生成manifest file:选中工程---&右键,Export---&Java---&JAR file---&选择jar file的路径及名称---&next---&next---&next;
目前安卓系统的市场份额是越来越大,众多国外引进的应用也逐渐受到国人的追捧,不过很多国外的安卓游戏由于是外语玩家玩起来也很费解。于是就有玩家自己动手做起文件的反编译进行汉化。反编译就是通过使用编译工具将文件中的源文件和资源反编译出来,得到的源文件和资源文件可以进行处理后再进行编译,以达到个性化定制,汉化等目的。编译方法使用编译文件只需要在安装后直接右击反编译就可以将文件反编译出来使用原生工具,需要将的两...
04-23 / 19.5M
推荐理由:Apk+Dex文件反编译及回编译工具(APKDB),必须在JAVA环境下才能运行,使用前,请安装JAVA环境。Apk+Dex文件反
11-24 / 13.6M
推荐理由:来自国外安卓论坛的反编译APK文件的工具,工具中集成了反编译,编译,签名等选项,对于DIY安卓软件者是必备
11-20 / 13.9M
推荐理由: 来自国外安卓论坛的反编译APK文件的工具,工具中集成了反编译,编译,签名等选项,对于DIY安卓软件者是必备
04-28 / 6.8M
推荐理由:APK编译专家可以在电脑上随意修改apk文件,包括对apk文件的解包、打包、签名、汉化等等操作。同时该APK编译
03-01 / 11.9M
推荐理由:今天看到有人提到otertool,很好用的一个工具,可以直接打开apk,修改smali,然后保存;不过只有linux的版本
02-28 / 11.0M
推荐理由:原版工具是友友推荐我使用的,感觉不是很人性化!尤其是在反编译HTC Rom的系统文件时,工具不能自动安装com
12-1311-0701-0711-0301-2101-1701-1701-1501-1301-13
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载使用Java扩展机制加载所有JAR包 - ImportNew
| 标签: , ,
在中被描述为一种“通过标准可扩展的方式来让Java平台上所有应用使用自定义API”。正如在中描述的,“扩展框架充分使用了类加载代理机制”。这种机制会在rt.jar引导(boot)类加载之后,标准中的类加载之前,加载扩展类。
扩展目录的工作机制在类的加载上与有点类似。对Java应用程序来说,所有扩展目录下JAR文件包含的类都可以访问。然而,会有一些关键的不同点。这些区别会在下面的文字中高亮显示。
扩展机制(可选包)
典型的应用相关
可执行JAR Manifest的
主机上所有可能的JRE
所有运行在特定JRE上的JVM
各种主机上的JRE
Solaris: /usr/jdk/packages/lib/ext
Linux: /usr/java/packages/lib/ext
Windows: %SystemRoot%\Sun\Java\lib\ext
明确的通过名字来指定(包括 .jar)
使用通配符来匹配所有的.jar扩展
.class Files
指定目录下的.class文件
所有在指定目录下的JAR文件都会被加载(即使扩展名不是.jar或者没有扩展名)
类加载顺序
引导和扩展类加载之后
引导类加载之后,classpath上的类加载之前
一个最重要且值得重视的问题是,扩展机制会找出所有jar格式的文件,即使文件后缀名不是.jar。这意味着,改变classpath中的jar文件后缀名以此逃过通配符的筛选,这种方法在扩展目录中行不通。
我会用一些简单的例子来展示一些上面提到的区别。接下来的两段代码是一个简单的HelloWorld类和一个main应用程序中的Main类。Main通过调用main方法来使用HelloWorld类。
HelloWorld.java
public class HelloWorld
public String toString()
return &Hello, World!&;
import static java.lang.System.
public class Main
public static void main(final String[] arguments)
out.println(new HelloWorld());
为了展示classpath和扩展机制的主要区别,我将会把编译过的HelloWorld.class文件归档到一个jar包里,命名为HelloWorld.jar。并把它放在一个跟编译过的Main.class不同的目录下。
为了展示传统的classpath的使用,我把HelloWorld.jar放在一个叫做C:\hello的目录下并且会用通配符访问JAR来给Main使用。下面的两个截图对此进行了展示。
以上两个截图说明,尽管我删掉了当前目录下的HelloWorld.class,Java 主应用仍然能加载它。这是因为被告知(通过-classpath这个可选参数)去C:\hello目录下寻找。使用扩展机制,不需要把类放到当前目录或者指定到 classpath下就可以加载。接下来的截图展示了这一点。
上面的截图说明,当某个类是在扩展目录下的某个JAR里,Java launcher甚至不需要把HelloWorld.class放到同一个目录下或者在classpath中指定。这常常被用来说明。因为所有在这个JRE(或者可能是主机上的所有应用)上运行的程序都可以不用在classpath上指定就能看到扩展目录下的类。
使用传统classpath方式——指导应用去加载JAR中的类,包含.class文件的JAR文件必须以.jar结尾。接下来的截图展示了当把在 classpath引用的目录下的HelloWorld.jar重命名为HelloWorld.backup之后所发生的事情。
上面这张图展示了当classpath引用的目录下JAR文件没有以.jar结尾时发生的异常。可能有点令人惊讶,扩展机制不是这样工作的。所有在扩展目录下的JAR文件,不管后缀名是什么甚至没有后缀名都会被加载。接下来的截图展示了这一点。
这张图展示了,给在扩展目录中的JAR文件重命名为没有后缀的文件并不妨碍类加载器加载JAR文件中的类。换句话说,类加载机制是通过文件类型而不是文件名或后缀来加载所有在扩展目录中的JAR文件的。正如所总结的,“JAR文件本身没有什么特别的地方,其中包含的class文件也没有让JAR成为已安装过的可选包。只有位于jre/lib/ext下,才可能让JAR成为已安装的可选包。”
在扩展目录中放包含太多类定义的JAR会有一些和负面效果。例如,当我们看到classpath中所指定的类方法存在,还报出异常,会令人非常恼火。这是我以前众多可以导致NoSuchMethodError问题的其中一个。但是忘记扩展目录下JAR文件中的过时(outdated)和废弃的(obsolete)类是另一个潜在的原因。接下来会展示这一点。
接下来的两段代码展示了Main.java和HelloWorld.java修改后的版本。特别要注意的是,HelloWorld有一个全新的方法,这个 方法会被新版本的Main调用。在这个例子中,我会把新编译的HelloWorld.class文件和Main放在同一个目录下。这样当我运行Main 的时候,就能证明扩展目录下的JAR中过时的类会比当前目录下的新类优先加载。
修改后的Hello World.java(新方法)
public class HelloWorld
public String toString()
return &Hello, World!&;
public String directedHello(final String name)
return &Hello, & +
修改后的Main.java
import static java.lang.System.
public class Main
public static void main(final String[] arguments)
final HelloWorld helloWorld = new HelloWorld();
out.println(helloWorld);
out.println(helloWorld.directedHello(&Dustin&));
最后一张截图展示了,扩展目录下过时的HelloWorld类优先于同一目录下的新定义的HelloWorld类加载。甚至当我把当前目录写进 classpath中,扩展目录下的旧版本的类仍然优先。接下来的图也同样展示了扩展目录下的JAR文件“隐藏”了更新的JAR以及其中类的新方法。这些扩展目录下的JAR文件甚至都不是以.jar结尾的。
刚刚展示的这个例子,在扩展目录下JAR导致的众多问题来说不算很复杂。例子中,至少有一个NoSuchMethodError来提醒这个问 题。一个潜在的更加复杂的情况是,旧的类有和新类一样的方法签名但实现的方式已经过时。在这种情况下,可能没有错误、异常或者throwable中任何一种,但是应用的逻辑不会像预期那样工作。旧的方法可能会一直存在代码的底层直到被发现。当缺乏单元测试或其他测试时尤其如此。
使用扩展目录会让开发人员变得轻松。因为扩展目录下JAR文件中的类,可以被所有运行在与此扩展目录(如果在操作系统上在主机范围内启用扩展目录,那么所有主机上的JRE都可以访问)关联JRE上的应用访问。然而,随意使用扩展目录会有一定的风险。你会非常容易忘记扩展目录下过时的类。这会妨碍类加载器选择明显应当被加载的版本。这种情况下,本来应该让开发者感觉轻松的扩展机制会让他们非常痛苦。
Elliotte Rusty Harold提对扩展机制有一个警告:“尽管这些看上去很方便,从长远来看也是引入了一个隐患,迟早你会从一个你根本没想过的地方载入一个错误的类版本。这会浪费你不少时间调试”。Java教程同样提出警告(我在这里也着重强调):“尽管这个机制扩展了平台的核心API,但是应该审慎使用。大部分情况,它是用于像JCP这样标准化比较好的接口,同时也适用于整个站点的接口”。
尽管扩展(可选包)机制与classpath机制很像,并且它们都用于部分的类加载,两者之间的区别也是非常值得注意的。特别的,记住所有的在扩展目录下的JAR文件(即使它们没有以.jar结尾)都会被加载是很重要的。给那些JARs重命名甚至改变他们的文件后缀名都不足以让类加载器忽略它们。另一方面,使用classpath的时候,重命名classpath中指定的JAR文件会使该JAR无法加载,改变后缀名后,即使在classpath中使用通配符也无法加载所有目录中的JAR。
一些情况下,扩展机制是比较好的选择,但是这种情况相当少。当处理预期以外的NoSuchMethodErrors问题时,记住扩展机制使很重要的。这样就会去检查看看是否问题就出在扩展的目录中。
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
(新浪微博:bc0303)
顶一个!仰慕白衣大哥好久了!
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2016 ImportNewspark-submit提交作业时依赖jar包问题 - 开源中国社区
当前访客身份:游客 [
当前位置:
你好,想跟你请教个问题:是不是无论是standalone或者yarn在提交作业时都会把jar包上传到各个节点上面去,但我在查看运行作业时没有看到上传的记录,如果是上传了,是不是上传到hdfs,我应该在什么地方可以看到它们,谢谢
共有3个答案
<span class="a_vote_num" id="a_vote_num_
所有需要提交的jar的路径都需要放在JavaSparkContext最后一个参数里面(除了一些基础的jar,比如jdk自带的),然后在提交任务时就可以看到很多addJar的日志。下面是我添加所有classpath下jar的方法,供你参考:
* 按照指定关键字排除掉某些jar
* @param jar
* @param exclusiveJars classpath下不需要加入的jar
public static String[] addClassPathButSomeJar(String jar, String[] exclusiveJars) {
Set&String& classpath = new HashSet&String&();
classpath.add(jar);
Properties p = System.getProperties();
String value = p.getProperty("java.class.path");
String[] jars = value.split(File.pathSeparator);
for (int i = 0; i & jars. i++) {
boolean isAdd =
String jarPath = jars[i];
String jarName = jarPath.replaceAll("^.*?lib/", "");
//不是以jar为结尾的不需要加入。
if (!jarName.endsWith("jar")) {
for (String exclusiveJar : exclusiveJars) {
if (jarName.contains(exclusiveJar)) {
if (isAdd) {
classpath.add(jarPath);
String[] jarArray = new String[classpath.size()];
return classpath.toArray(jarArray);
<span class="a_vote_num" id="a_vote_num_
你好,我的意思是,每次submit都会上传一次jar包,觉得很浪费,所以想hdfs上面建一个jar库,这样不用每次都上传了,请问你有没有这样做过
--- 共有 1 条评论 ---
一个context只有在第一次初始化的时候需要上传,以后直接使用不会再传了,一个主机也只能初始化一个context。放在hdfs上没试过
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
可以在spark-default.cof里配置 本地文件目录。这样就不会上传了。
standalone好像是传到spark的一个 working目录下。
yarn会上传到HDFS 的 /usr下一个 spark目录。要看具体的配置项。
spark.yarn.jar
&The location of the Spark jar file, in case overriding the default location is desired. By default, Spark on YARN will use a Spark jar installed locally, but the Spark jar can also be in a world-readable location on HDFS. This allows YARN to cache it on nodes so that it doesn't need to be distributed each time an application runs. To point to a jar on HDFS, for example, set this configuration to "hdfs:///some/path".
更多开发者职位上
有什么技术问题吗?
czmabc...的其它问题
类似的话题将引用了第三方jar包的Java项目打包成jar文件的两种方法 - 世间存在真情 - 推酷
将引用了第三方jar包的Java项目打包成jar文件的两种方法 - 世间存在真情
方案一:用Eclipse自带的Export功能
步骤1:准备主清单文件 “MANIFEST.MF”,
由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下:
Manifest-Version: 1.0
Class-Path: lib/commons-codec.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.jar lib/log4j-1.2.16.jar lib/jackson-all-1.8.5.jar
Main-Class: main.KillCheatFans
第一行是MAINIFEST的版本,第二行Class-Path就指定了外来jar包的位置,第三行指定我们要执行的MAIN java文件。
这里要注意几点:
1、Class-Path: 和Main-Class: 后边都有一个空格,必须加上,否则会打包失败,错误提示为:Invalid header field;
2、假设我们的项目打包后为KillCheatFans.jar,那么按照上面的定义,应该在 KillCheatFans.jar的同层目录下建立一个lib文件夹(即lib文件和打包的jar文件
在同一个目录下),并将相关的jar包放在里面。否则将会出现“Exception in thread &main& java.lang.NoClassDefFoundError”的错误;
3、Main-Class后面是类的全地址,比如你的主文件是KillCheatFans.java,文件里打包为package com. 那么这里就写com.main.KillCheatFans,
不要加.java后缀,主文件地址写错将会出现“找不到或无法加载主类”的错误;
4、写完Main-Class后一定要回车(即最后一行是空白行),让光标到下一行,这样你生成的jar包才能找到你的主class去运行,
否则将会出现“jar中没有主清单属性”的错误。
步骤2:右击Java工程选择Export—&选择JAR file—&Next
步骤3:选择要打包的文件,不需要的文件不必打包,减小打包后的jar文件大小,并进行选项配置如下
这里有几个选项:
* Export generated class files and resources 表示只导出生成的.class文件和其他资源文件
* Export all output folders for checked projects 表示导出选中项目的所有文件夹
* Export java source file and resouces 表示导出的jar包中将包含你的源代码*.java,如果你不想泄漏源代码,那么就不要选这项了
* Export refactorings for checked projects 把一些重构的信息文件也包含进去
步骤4:选择我们在第一步中自定义的配置文件路径,这一步很重要,不能采用默认选项
这里解释一下配置项:
* Generate the manifest file:是系统帮我们自动生成MANIFEST.MF文件,如果你的项目没有引用其他class-path,那可以选择这一项。
* Use existing mainfest from workspace:这是可以选择我们自定义的.MF文件,格式如上所写,引用了第三方包时选用。
* Seal content:要封装整个jar或者指定的包packet。
* Main class:这里可以选择你的程序入口,将来打包出来的jar就是你这个入口类的执行结果。
最后Finish,即生成了我们要的jar文件。
运行该jar文件有两种方式:
1. 在命令行下运行命令java -jar 你的jar文件名称,比如我的执行如下:
如果在jar中有一些System.out.prinln语句(如上执行结果),运行后不想在控制台输出而是保存在文件中方便以后查看,可以用一下命令:
java -jar KillCheatFans.jar & log.txt (这时命令行窗口不会有任何输出)
输出信息会被打印到log.txt中,当然log.txt自动生成,并位于和KillCheatFans.jar一个目录中。
2. 新建一个批处理文件,如start.bat,内容为:java -jar KillCheatFans.jar,放在jar文件同一目录下即可,以后点击自动运行即可,更加方便。
方案二:安装Eclipse打包插件Fat Jar
方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐。这时可以使用一个打包的插件—Fat Jar。
Fat Jar Eclipse Plug-In是一个可以将Eclipse Java Project的所有资源打包进一个可执行jar文件的小工具,可以方便的完成各种打包任务,我们经常会来打jar包,但是eclipse自带的打包jar似乎不太够用,Fat Jar是eclipse的一个插件,特别是Fat Jar可以打成可执行Jar包,并且在图片等其他资源、引用外包方面使用起来更方便。
安装方法:
1. Eclipse在线更新方法
Help & Install New Software & Add,
name:Fat Jar
location:http://kurucz-grafika.de/fatjar
2. Eclipse插件手动安装方法
下载地址:http://downloads.sourceforge.net/fjep/net.sf.fjep.fatjar_0.0.27.zip?modtime=&big_mirror=0
将解压出的plugins中的文件复制到eclipse安装目录中的plugins目录下,然后重启eclipse即可。
使用方法:
步骤1:右击工程项目选择Buile Fat Jar
步骤2:配置jar文件存放目录,主Main文件等,如下图
步骤3:选择所要用到的第三方jar包
最后Finish,即生成了我们要的jar文件,十分方便。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Java如何获取当前的jar包路径以及如何读取jar包中的资源 - 推酷
Java如何获取当前的jar包路径以及如何读取jar包中的资源
写作业的时候要输出一个record.dat文件到jar包的同级目录,但是不知道怎么定位jar包的路径。百度到的方法不很靠谱,所以在这里记录一下。
一:使用类路径
1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
因为程序已经被打包成jar包,所以getPath()和getFile()在这里的返回值是一样的。都是/xxx/xxx.jar这种形式。如果路径包含Unicode字符,还需要将路径转码
path = java.net.URLDecoder.decode(path, &UTF-8&);
二:使用JVM
String path = System.getProperty(&java.class.path&);
利用了java运行时的系统属性来得到jar文件位置,也是/xxx/xxx.jar这种形式。
这样,我们就获得了jar包的位置,但是这还不够,我们需要的是jar包的目录。
1 int firstIndex = path.lastIndexOf(System.getProperty(&path.separator&)) + 1;
2 int lastIndex = path.lastIndexOf(File.separator) + 1;
3 path = path.substring(firstIndex, lastIndex);
来得到目录。
path.separator在Windows系统下得到;(分号),在Linux下得到:(冒号)。也就是环境变量中常用来分割路径的两个符号,比如在Windows下我们经常设置环境变量PATH=xxxx\xxx\这里获得的就是这个分号。
File.separator则是/(斜杠)与\(反斜杠),Windows下是\(反斜杠),Linux下是/(斜杠)。
如何加载jar包中的资源。
1. 比如说我要得到背景图片,源代码中它是
/src/UI/image/background.jpg
那么在jar包中它的路径应该是
/UI/image/background.jpg
路径最前面的/表示根目录,即绝对路径,若没有最左边的/,则表示相对路径。使用哪种方法看自己的需求,这里使用了绝对路径。
加载的时候使用
1 java.net.URL fileURL = this.getClass().getResource(&/UI/image/background.jpg&);
2 javax.swing.Image backGround = new ImageIcon(fileURL).getImage();
即可以获得该图片资源。
2. 有时候,我们需要加载文本资源或音乐资源,而文本在Java中是以流对象存在的,这时我们就要使用
InputStream in = this.getClass().getResourceAsStream(&/UI/image/background.txt&);
加载该资源。
PS:注意这里两种方法的区别,第一种是先得到该文件的路径,再加载该文件资源。第二种则是直接加载该对象。
3.有时候,我们有一些资源类,其中的资源对象都是pulic static final修饰的,这里可以采用这样的方法初始化。
比如说我有一个ImageSource类用来加载各种图片资源,那么可以如下使用
1 public class ImageSource
URL fileURL = ImageSource.class.getResource(“/UI/image/background.jpg”);
BACK_GROUND = new ImageIcon(fileURL).getImage();
public static final Image BACK_GROUND;
这里不能用构造函数初始化,因为构造函数和对象相关,而static变量和对象是无关的,只和类相关。在Java的语法中,类中的static块是不依赖类对象的,因此可以初始化statc对象。同时,static块中不能使用this,这里使用了ImageSource.class代替。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 java jar 指定main 的文章

 

随机推荐