精华内容
下载资源
问答
  • 在应用程序中处理Jar文件简单介绍了如何使用java.util.jar包提供的API操作jar文件,下面通过一个相对复杂的例子讲述一些Jar文件相关的高级应用。仔细读读这篇文章并参考一下相关的java doc会对你学习java语言有很大...

    在应用程序中处理Jar文件简单介绍了如何使用java.util.jar包提供的API操作jar文件,下面通过一个相对复杂的例子讲述一些Jar文件相关的高级应用。仔细读读这篇文章并参考一下相关的java doc会对你学习java语言有很大的帮助。

    下面的应用程序将实现从http服务器装载并执行一个jar文件的功能,比如你的Jar文件的地址为hello.jar。要实现这个功能我们应该首先建立与这个文件的连接然后通过MANIFEST的信息描述得到Main-Class的值,最后装载并运行这个class。这里面需要用到java.net和反射的一些重要知识。这个应用程序由两个类组成:JarClassLoader和JarRunner。

    JarClassLoader扩展了URLClassLoader,它有一个成员为URL类型的url变量。

    publicJarClassLoader(URL url)

    {super(newURL[] { url });this.url =url;

    }

    它的两个重要方法是getMainClassName()和invokeClass(),其中前者的目的是通过URL和jar取得连接后,读取MANIFEST的Main-Class属性从而得到应用程序的入点,这非常重要。得到入点后我们就可以通过反射机制装载和运行得到的主类。

    public String getMainClassName() throwsIOException {

    URL u= new URL("jar", "", url + "!/");

    JarURLConnection uc=(JarURLConnection)u.openConnection();

    Attributes attr=uc.getMainAttributes();return attr != null

    ?attr.getValue(Attributes.Name.MAIN_CLASS)

    :null;

    }public voidinvokeClass(String name, String[] args)throwsClassNotFoundException,

    NoSuchMethodException,

    InvocationTargetException

    {

    Class c= this.loadClass(name);

    Method m= c.getMethod("main", newClass[] { args.getClass() });

    m.setAccessible(true);int mods =m.getModifiers();if (m.getReturnType() != void.class || !Modifier.isStatic(mods) ||

    !Modifier.isPublic(mods)) {throw new NoSuchMethodException("main");

    }try{

    m.invoke(null, newObject[] { args });

    }catch(IllegalAccessException e) {//This should not happen, as we have disabled access checks

    }

    }

    URL u= new URL("jar", "", url + "!/");

    JarURLConnection uc= (JarURLConnection)u.openConnection();

    这两段代码构造一个JarURLConnection的实例,注意!/的分隔符的意思是这个url表示的是整个jar文件。这样我们就建立了和jar文件的通信。方法中的后面两句话得到jar文件的主类。在invokeClass方法中,我们首先通过ClassLoader的方法得到包括程序入口的主类,然后得到main方法,判断main方法为我们需要的方法后则调Method的invoke方法执行这个应用程序。

    下面是源程序的代码

    importjava.net.URL;importjava.net.URLClassLoader;importjava.net.JarURLConnection;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;importjava.lang.reflect.InvocationTargetException;importjava.util.jar.Attributes;importjava.io.IOException;class JarClassLoader extendsURLClassLoader {privateURL url;publicJarClassLoader(URL url) {super(newURL[] { url });this.url =url;

    }public String getMainClassName() throwsIOException {

    URL u= new URL("jar", "", url + "!/");

    JarURLConnection uc=(JarURLConnection)u.openConnection();

    Attributes attr=uc.getMainAttributes();return attr != null ? attr.getValue(Attributes.Name.MAIN_CLASS) : null;

    }public voidinvokeClass(String name, String[] args)throwsClassNotFoundException,

    NoSuchMethodException,

    InvocationTargetException

    {

    Class c= this.loadClass(name);

    Method m= c.getMethod("main", newClass[] { args.getClass() });

    m.setAccessible(true);int mods =m.getModifiers();if (m.getReturnType() != void.class || !Modifier.isStatic(mods) ||

    !Modifier.isPublic(mods)) {throw new NoSuchMethodException("main");

    }try{

    m.invoke(null, newObject[] { args });

    }catch(IllegalAccessException e) {//This should not happen, as we have disabled access checks

    }

    }

    }

    importjava.io.IOException;importjava.net.URL;importjava.net.MalformedURLException;importjava.lang.reflect.InvocationTargetException;/*** Runs a jar application from any url. Usage is 'java JarRunner url [args..]'

    * where url is the url of the jar file and args is optional arguments to

    * be passed to the application's main method.*/

    public classJarRunner {public static voidmain(String[] args) {if (args.length < 1) {

    usage();

    }

    URL url= null;try{

    url= new URL(args[0]);

    }catch(MalformedURLException e) {

    fatal("Invalid URL: " + args[0]);

    }//Create the class loader for the application jar file

    JarClassLoader cl = newJarClassLoader(url);//Get the application's main class name

    String name = null;try{

    name=cl.getMainClassName();

    }catch(IOException e) {

    System.err.println("I/O error while loading JAR file:");

    e.printStackTrace();

    System.exit(1);

    }if (name == null) {

    fatal("Specified jar file does not contain a 'Main-Class'" +

    " manifest attribute");

    }//Get arguments for the application

    String[] newArgs = new String[args.length - 1];

    System.arraycopy(args,1, newArgs, 0, newArgs.length);//Invoke application's main class

    try{

    cl.invokeClass(name, newArgs);

    }catch(ClassNotFoundException e) {

    fatal("Class not found: " +name);

    }catch(NoSuchMethodException e) {

    fatal("Class does not define a 'main' method: " +name);

    }catch(InvocationTargetException e) {

    e.getTargetException().printStackTrace();

    System.exit(1);

    }

    }private static voidfatal(String s) {

    System.err.println(s);

    System.exit(1);

    }private static voidusage() {

    fatal("Usage: java JarRunner url [args..]");

    }

    }

    我们编写一个简单的HelloWorld程序,然后打个jar包,注意你的jar包内的MANIFEST文件一定要包括Main-Class: HelloWorld,否则的话找不到程序的入口。把它放在一个web服务器上比如http://localhost/hello.jar。编译源程序后执行

    java JarRunner http://localhost/hello.jar (可以含有参数)在控制台我们会看到hello world的字样输出!

    展开全文
  • Class,如果没有设置Main-Class则调用方法中指定执行函数2、解压jar文件3、设置classPath4、利用反射取得class和method,并运行该method如下代码Run.java将被打包到jar文件中,使用Maven构建并打包:package ...

    1、使用JarFile类读取jar包MANIFEST.MF中的Main-Class,如果没有设置Main-Class则调用方法中指定执行函数

    2、解压jar文件

    3、设置classPath

    4、利用反射取得class和method,并运行该method

    如下代码Run.java将被打包到jar文件中,使用Maven构建并打包:

    package com.chenzehe.runjar;

    public class Run {

    /**

    * @param args

    */

    public static void main(String[] args) {

    System.out.println("run......");

    if (args.length > 0) {

    System.out.println("args: " + args[0]);

    }

    }

    }

    开始打包没有指定在MANIFEST.MF中指定Main-Class,下面运行时只能指定要运行的类。

    RunJar.java为解析并执行该jar文件方法的类:

    package com.chenzehe.runjar;

    import java.io.File;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.OutputStream;

    import java.lang.reflect.Array;

    import java.lang.reflect.InvocationTargetException;

    import java.lang.reflect.Method;

    import java.net.URL;

    import java.net.URLClassLoader;

    import java.util.ArrayList;

    import java.util.Arrays;

    import java.util.Enumeration;

    import java.util.jar.JarEntry;

    import java.util.jar.JarFile;

    import java.util.jar.Manifest;

    public class RunJar {

    /**

    * @param args

    */

    public static void main(String[] args) throws Throwable {

    String usage = "RunJar jarFile [mainClass] args...";

    if (args.length < 1) {

    System.err.println(usage);

    System.exit(-1);

    }

    int firstArg = 0;

    String fileName = args[firstArg++];

    File file = new File(fileName);

    // 从jar文件MANIFEST.MF中读取Main-Class

    String mainClassName = null;

    JarFile jarFile;

    try {

    jarFile = new JarFile(fileName);

    } catch (IOException io) {

    throw new IOException("Error opening job jar: " + fileName)

    .initCause(io);

    }

    Manifest manifest = jarFile.getManifest();

    if (manifest != null) {

    mainClassName = manifest.getMainAttributes().getValue("Main-Class");

    }

    jarFile.close();

    if (mainClassName == null) {

    if (args.length < 2) {

    System.err.println(usage);

    System.exit(-1);

    }

    // 如果MANIFEST.MF未设置Main-Class,则用户输入

    mainClassName = args[firstArg++];

    }

    mainClassName = mainClassName.replaceAll("/", ".");

    final File workDir = File.createTempFile("unjar", "",

    new File(System.getProperty("user.dir")));

    workDir.delete();

    workDir.mkdirs();

    if (!workDir.isDirectory()) {

    System.err.println("Mkdirs failed to create " + workDir);

    System.exit(-1);

    }

    // 解压jar文件

    unJar(file, workDir);

    // 设置classPath

    ArrayList classPath = new ArrayList();

    classPath.add(new File(workDir + "/").toURL());

    classPath.add(file.toURL());

    ClassLoader loader = new URLClassLoader(classPath.toArray(new URL[0]));

    Thread.currentThread().setContextClassLoader(loader);

    // 利用反射取得class和method

    Class> mainClass = Class.forName(mainClassName, true, loader);

    Method main = mainClass.getMethod("main", new Class[] { Array

    .newInstance(String.class, 0).getClass() });

    String[] newArgs = Arrays.asList(args).subList(firstArg, args.length)

    .toArray(new String[0]);

    try {

    // 运行方法

    main.invoke(null, new Object[] { newArgs });

    } catch (InvocationTargetException e) {

    throw e.getTargetException();

    }

    }

    //解压jar包中的文件到toDir目录

    public static void unJar(File jarFile, File toDir) throws IOException {

    JarFile jar = new JarFile(jarFile);

    try {

    Enumeration entries = jar.entries();

    while (entries.hasMoreElements()) {

    JarEntry entry = (JarEntry) entries.nextElement();

    if (!entry.isDirectory()) {

    InputStream in = jar.getInputStream(entry);

    try {

    File file = new File(toDir, entry.getName());

    if (!file.getParentFile().mkdirs()) {

    if (!file.getParentFile().isDirectory()) {

    throw new IOException(

    "Mkdirs failed to create "

    + file.getParentFile()

    .toString());

    }

    }

    OutputStream out = new FileOutputStream(file);

    try {

    byte[] buffer = new byte[8192];

    int i;

    while ((i = in.read(buffer)) != -1) {

    out.write(buffer, 0, i);

    }

    } finally {

    out.close();

    }

    } finally {

    in.close();

    }

    }

    }

    } finally {

    jar.close();

    }

    }

    }

    该代码为Hadoop中job提交到服务器调用的代码RunJar。

    展开全文
  • 在学习和开发java项目中,我们经常会用到第三方提供的一些jar。使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间。有的第三方工具,提供详细的使用说明和源代码,有时有的却不提供源代码,使用说明也...

    在学习和开发java项目中,我们经常会用到第三方提供的一些jar。使用这些第三方工具包,可以提高我们开发的效率,缩短开发的时间。有的第三方工具,提供详细的使用说明和源代码,有时有的却不提供源代码,使用说明也不是很详细,这对我们使用就非常不方便。

    ce523856c533e79a0f0a8e2a90d72d28.png

    有道是,知其然才知其所以然。有时候,我们必须读取jar里的打包的类。而有时还有可能要对它进行小量修改,使之适用于自己的特殊需求。

    前期准备

    Java反编译工具:

    强烈推荐,小颖java源代码反编译系列专家1.4终极版。

    压缩工具:

    Winrar

    开始

    1. 将jar包解压

    我们可以使用winrar工具将jar解压到指定目录

    2. 反编译class

    使用 Java 反编译工具,将class文件反编译为java文件。(大多数反编译工具只提供单个class文件的反编译,这里推荐"小颖JAVA源代码反编译"工具,可以反编译一个目录下的所有class文件)

    3. 构建项目

    我们将反编译后的java文件设为项目的源文件目录。

    将jar,及jar所需要的其它lib,作为libraries加入项目中,这样可以保证我们的java文件可以编译。

    4. 对反编译的java进行修改

    通过反编译的java文件,可能还有错误,不能编译通过,在不影响作者原始意图的前提下,我们必须对它进行小量修改,保证可编译通过。

    保证java文件可以编译通过后,我们再在其基础上进行修改,使之符合自己的需求。

    5. 编译修改的java

    编译修改后的java文件,注意的是,最好只编译修改的单个java文件。

    编译完成后,我们进行测试,保证修改无误。因为JVM会先找寻classes目录下的class文件,并率先加入,这样我们修改编译后的class文件,便是测试时使用的class文件。

    重复这个过程,直至java达到我们的目的。

    6. Jar打包

    将修改生成后的class文件,替换我们将jar解压缩目录下的相应class文件,重新打包生成jar。

    我们可以使用jar命令进行打包,也可以使用winrar工具进行打包。使用winrar工具打包时,要注意选择压缩文件格式为zip,并将生成的压缩包文件的后缀名设置为jar。

    替换原来的jar。再进行最后一次测试。

    总结

    由于Java的跨平台性,使得java的class文件可以进行反编译,我们可以对jar文件进行修改,使之适用于自己的需求。

    对jar文件进行修改,我们必须首先获得jar开发者的同意。

    对jar文件进行修改,首先必须对反编译的java文件比较熟悉。这就必须有良好的代码阅读能力,清楚作者的技术架构和开发设计思想。如果没有把握,最好能与jar开发者联系,提出你的需求。

    对于某些java开发者来说,并不希望将自己辛辛苦苦写的code公布于众,为了避免他人反编译,可以使用混淆器,但也只是增加代码阅读的困难性。如果不是作为商业运用,我们还是希望开发者能够提供源代码,互相学习探讨。

    展开全文
  • 解析xml文件用到了dom4j-1.6.1.jar包,具体版本可能有新旧之分,我提供如下某度云盘,供下载测试用。链接:http://pan.baidu.com/s/1i5Aw8Jz 密码:qma7下面是我的测试代码:先是主要测试文件:package ...

    解析xml文件用到了dom4j-1.6.1.jar包,具体版本可能有新旧之分,我提供如下某度云盘,供下载测试用。

    链接:http://pan.baidu.com/s/1i5Aw8Jz 密码:qma7

    下面是我的测试代码:

    先是主要测试文件:

    package com.lxk.xmlTest;

    import com.google.common.collect.Lists;

    import org.dom4j.Document;

    import org.dom4j.DocumentException;

    import org.dom4j.Element;

    import org.dom4j.io.SAXReader;

    import java.io.File;

    import java.util.Arrays;

    import java.util.List;

    /**

    * Created by lxk on 2016/11/10

    */

    public class XmlTest {

    public static void main(String[] args) {

    xmlTest();

    }

    /**

    * 测试解析xml文件

    */

    @SuppressWarnings("unchecked")

    private static void xmlTest() {

    SAXReader reader = new SAXReader();

    reader.setEncoding("utf-8");

    Document document;

    try {

    document = reader.read(new File("src/testConfig.xml"));

    Element root = document.getRootElement();//得到xml跟标签,此处是

    List list = root.elements("stream");

    List xmlNodeList = Lists.newArrayList();//得到xml文件的配置信息

    for (Element e : list) {

    List streamIds = Arrays.asList(e.element("streamId").getStringValue().split(","));

    XmlModel temp = new XmlModel(streamIds, e.element("name").getStringValue());

    xmlNodeList.add(temp);

    }

    for (XmlModel xmlModel : xmlNodeList) {

    System.out.println(xmlModel);

    }

    } catch (DocumentException e) {

    e.printStackTrace();

    }

    }

    }

    然后是节点model文件:

    package com.lxk.xmlTest;

    import java.util.List;

    /**

    * 配置文件节点 model

    *

    * Created by lxk on 2016/11/10

    */

    public class XmlModel {

    /**

    * 流ID

    */

    private List streamIds;

    /**

    * 流名称

    */

    private String name;

    /**

    * 默认构造函数

    * (在构造model的时候,若要添加新的带参数构造函数,那么这个默认函数一定要写。避免出现你不知道的错)

    */

    public XmlModel() {

    }

    /**

    * 带参构造函数

    */

    public XmlModel(List streamIds, String name) {

    this.streamIds = streamIds;

    this.name = name;

    }

    public List getStreamIds() {

    return streamIds;

    }

    public void setStreamIds(List streamIds) {

    this.streamIds = streamIds;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    @Override

    public String toString() {

    return "单个节点{" +

    "streamIds=" + streamIds +

    ", name='" + name + '\'' +

    '}';

    }

    }

    最后是xml配置文件:(里面的标签随自己意取名,在Java文件对应就可以)

    576a32b7393048060fdeb463,57198f91c5e62fca950103fd

    借记卡及贷记卡总量

    57ba9ea8e4b040a7317c86a0,57f88f52e4b0fbcf8381665f

    支付宝-借记卡

    580f0b32e4b034a9cf9eaaa6

    支付宝-贷记卡

    580f058ee4b034a9cf9eaaa2

    财付通-借记卡

    57918dade4b0e55b2369e165

    财付通-贷记卡

    579af7c3e4b0c5e678ed9853

    其他借记卡快捷类交易

    580f0c2ae4b034a9cf9eaaa8

    其他贷记卡快捷类交易

    运行结果:

    0818b9ca8b590ca3270a3433284dd417.png

    展开全文
  • 使用Java解析XML

    2021-02-12 20:48:54
    解析的方法介绍1.DOM(docuement object model)解析把所有的XML内容读到内存中,形成树状结构。这个树状结构是一个对象,名字叫docuementDOM解析中的一些术语Doucment:整个对象(整颗数)Element:元素,就是标签,上面...
  • 一种将JAR文件解析java的方法及系统的制作方法【技术领域:】[0001]本发明涉及网络安全技术领域:,尤其涉及一种将JAR文件解析java的方法及系统。【背景技术:】[0002]就像MP3格式的文件记录着声音信息,avi格式...
  • 本文实例讲述了从Javajar文件中读取数据的方法。分享给大家供大家参考。具体如下:Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案。它们允许开发人员把所有相关的内容 (.class、图片、声音和支持...
  • java解析json的jar

    2021-03-06 04:34:37
    这是java解析json的jar包下载,功能很强大的jar包。包括json-lib,commons-beanutils,common-collections...软件介绍java解析json的jar包中使用json的必备jar包,包括commons-beanutils.jar,commons-httpclient....
  • } 需要将以上类打包成JAR,通过URLClassLoader读取 import org.junit.Test; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class Main { @Test public void test...
  • java – 获取JAR文件版本号

    千次阅读 2021-02-28 14:08:31
    我有一个用于群集的应用程序,以便在一个或多个失败时保持可用,并且我想实现一种方法来检查javajar文件的版本.我有这段代码来做(例如:在MyClass类中):URLClassLoader cl = (URLClassLoader) (new MyClass ())....
  • java jar解析:打包文件,引入文件cmd下:jar命令:package包打包javac命令:普通类文件打包Hello.java:package org.lxh.demo;public class Hello{public void print(){System.out.println("hello world");}}1例如:...
  • XMind是当前最为流行的思维导图软件,那么如何可以解析XMind文件呢?其实,Xmind文件就是压缩包,你可以使用解压缩工具把XMind文件解压。加压的文件目录如下:image.png其中最主要的是content.xml这个文件,打开这个...
  • java jar生成maven坐标

    2020-12-19 13:44:40
    使用本地maven仓库地址,配合需要生成jar名进行匹配坐标import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import java.io.*;import java.util.*;import java.util.stream.Collectors;public class GenPom {...
  • 这给你留下几个选项:(a)对于任何给定的JAR文件,您可以列出该JAR文件中的条目,找到.class文件,然后确定每个.class文件表示哪个Java类;或者(b)您可以使用为您执行此操作的库。选项(a):手动扫描JAR文件在这个选项...
  • 本文实例讲述了Java实现从jar包中读取指定文件的方法。分享给大家供大家参考,具体如下:以下的Java代码实现了从一个jar包中读取指定文件的功能:/*** This class implements the funcationality of reading and ...
  • 进行封装的时候,我们常常需要用xml来定义一些规范,在单独运行读取的时候当然不会有问题,但这些xml是往往是放在jar包里的,这样一来,这些东西就找不出来了。文中用到的xml定义如下:000450500MOISES MORENOT1T2T...
  • 运行jar时,主类应该在浏览器中打开这个html文件.我试过了:public static void main(String[] args) throws IOException, URISyntaxException {URL url = Snake.class.getResource("/WebContent/snake....
  • jdk下面一共有28个jar包,每个jar包发挥着不同的作用,让我们来解析一下 第一个:charsets.jar Java 字符集,这个类库中包含 Java 所有支持字符集的字符 第二个:deploy.jar Java安装目录的常见部分 - 该文件运行...
  • 但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:Java代码//源代码1:packageedu.hxraid;importjava.io.*;publicclassResource{publicvoidgetResource()thr...
  • 解析json常用jar

    2021-04-17 04:41:19
    加入 Jackson.jar? 2.在配置文件中配置 json 的映射? 3...和json都是一种数据交换格式 1.可读性 XML=JSON 2.可扩展性 广:XML=JSON JS :XML外部数据包:struts2.jar ,struts2-json-plugin-2.1.8.1.jar ,xwork-...
  • dwf文件格式解析数据可以用 <!-- https://mvnrepository.com/artifact/net.sourceforge/kabeja --> <dependency> <groupId>net.sourceforge</groupId> <artifactId>kabeja</...
  • 1.概述在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来。2. 拷贝至项目根目录项目根目录即pom.xml文件所在的同级目录,可以在项目根目录下创建文件夹...
  • 1)DOM解析DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分,是W3C的官方标准【优点】①允许应用程序对数据和结构做出更改。...
  • 获取JAR文件的版本号

    2021-07-17 00:52:49
    I have an application used in clustering to keep it available if one or more failed and I want to implement a way to check the version of the jar file in java.I have this piece of code to do that (e.g...
  • 解析nohup java -jar xxx &

    2021-04-06 11:37:16
    一直就知道 java -jar xx ctrl+c就退出了 来自这个文 ... java -jar XXX.jar &...” ,则变成 “java -jar XXX.jar ” ,表示在当前ssh窗口,可按CTRL + C打断程序运行,或者直接关闭窗口,则.
  • 本文研究的主要是Java 动态加载jar和class文件的相关内容,具体如下。JAVA中类文件加载是动态的。也就是说当我们用到的时候才会去加载,如果不用的话,就不会去加载我们的类。JAVA为我们提供了两种动态机制。第一种...
  • 1.DOM解析(官方)try {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse("file");NodeLis...
  • 如何读取jar包中的图片?‍一、首先,在eclipse中正常读取图片(用swing图形界面来测试)。‍1、目录结构如下图所示: test为工程名,测试类为photo.ReadTest,图片文件为img\test.png。2、代码如下所示:packagephoto...
  • 将自身部分功能打成jar...使用方式:开发时直接读取项目资源目录下的 properties即可打成jar包使用时,将配置文件与jar包放置在同一目录代码:import java.io.File;import java.io.FileInputStream;import java.io.F...
  • import java.io.File;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;import java.util.Enumeration;import jav...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 218,277
精华内容 87,310
关键字:

java解析jar

java 订阅