论坛首页 Java企业应用论坛

java 应用程序 自动检测更新,并自动关闭重启程序。

浏览 21408 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (5)
作者 正文
   发表时间:2011-03-22   最后修改:2011-03-22
奈落王 写道
OSGI..........

+2
或者,
package classloader;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.Attributes;

public class JarClassLoader extends URLClassLoader
{
    URL url;

    public JarClassLoader(URL url)
    {
        super(new URL[] { url });
        this.url = url;
    }

    public String getMainClassName() throws IOException
    {
        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 void invokeClass(String name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException
    {
        Class c = loadClass(name);
        Method m = c.getMethod("main", new Class[] { 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, new Object[] { args });
        }
        catch (IllegalAccessException e)
        {
        }
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IOException
    {
        URL url = new URL("file:/home/alipro/Desktop/a.jar");
        JarClassLoader jcl = new JarClassLoader(url);
        jcl.invokeClass(jcl.getMainClassName(), args);
    }
}
1 请登录后投票
   发表时间:2011-03-22  
楼上的问一下
客户端调用 URL("file:/home/alipro/Desktop/a.jar"); 如果a.jar有更新 它会自动更新,客户端这个类不用重启?
0 请登录后投票
   发表时间:2011-03-22  
java webstart
0 请登录后投票
   发表时间:2011-03-22  
chacha 写道
楼上的问一下
客户端调用 URL("file:/home/alipro/Desktop/a.jar"); 如果a.jar有更新 它会自动更新,客户端这个类不用重启?

是的,这和OSGI的机制是有点类似的
但是你需要新生成一个JarClassLoader对象,而不是使用以前的。
可以使用md5来判断文件是否有变化,如果有变化的话,就新建一个JarClassLoader,然后执行main方法
0 请登录后投票
   发表时间:2011-03-22  
是不是可以把眼光放宽点,我觉得用shell(或其他脚本)定时任务配合java就很好处理了
0 请登录后投票
   发表时间:2011-03-22  
我也想了个就是直接自定义classloade
App
|- lib <---放入包,用于加载jar
|- app.jar <--Main主要的启动文件

app.jar启动后自定义loader加载lib下的东西
自动更新->检查版本->有更新->下载jar到lib下替换原来的jar,备份到lib/back下即可->提示重启->重新启动即可


slippy 写道
奈落王 写道
OSGI..........

+2
或者,
package classloader;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.Attributes;

public class JarClassLoader extends URLClassLoader
{
    URL url;

    public JarClassLoader(URL url)
    {
        super(new URL[] { url });
        this.url = url;
    }

    public String getMainClassName() throws IOException
    {
        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 void invokeClass(String name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException
    {
        Class c = loadClass(name);
        Method m = c.getMethod("main", new Class[] { 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, new Object[] { args });
        }
        catch (IllegalAccessException e)
        {
        }
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IOException
    {
        URL url = new URL("file:/home/alipro/Desktop/a.jar");
        JarClassLoader jcl = new JarClassLoader(url);
        jcl.invokeClass(jcl.getMainClassName(), args);
    }
}

1 请登录后投票
   发表时间:2011-03-22  
两套程序,其中一套叫升级程序,另一套就是你的应用程序.点运行后升级程序先行,让其成为一个后台程序来管理应用程序的升级与启停.至于什么技术不重要,先弄明白这个.
0 请登录后投票
   发表时间:2011-03-22  
既然是tcp用推送到方式算了么,服务端一旦有更新直接向各个客户端推送,然后客户段接受,保存,再关闭时替换一下原有文件不行么!!!
0 请登录后投票
   发表时间:2011-03-23  
观察者模式  
0 请登录后投票
   发表时间:2011-03-23  
一般客户端不这样做,大多是运行的时候检测是否有最新,然后更新,再重新加载...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics