精华帖 (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); } } |
|
返回顶楼 | |
发表时间:2011-03-22
楼上的问一下
客户端调用 URL("file:/home/alipro/Desktop/a.jar"); 如果a.jar有更新 它会自动更新,客户端这个类不用重启? |
|
返回顶楼 | |
发表时间:2011-03-22
java webstart
|
|
返回顶楼 | |
发表时间:2011-03-22
chacha 写道 楼上的问一下
客户端调用 URL("file:/home/alipro/Desktop/a.jar"); 如果a.jar有更新 它会自动更新,客户端这个类不用重启? 是的,这和OSGI的机制是有点类似的 但是你需要新生成一个JarClassLoader对象,而不是使用以前的。 可以使用md5来判断文件是否有变化,如果有变化的话,就新建一个JarClassLoader,然后执行main方法 |
|
返回顶楼 | |
发表时间:2011-03-22
是不是可以把眼光放宽点,我觉得用shell(或其他脚本)定时任务配合java就很好处理了
|
|
返回顶楼 | |
发表时间: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); } } |
|
返回顶楼 | |
发表时间:2011-03-22
两套程序,其中一套叫升级程序,另一套就是你的应用程序.点运行后升级程序先行,让其成为一个后台程序来管理应用程序的升级与启停.至于什么技术不重要,先弄明白这个.
|
|
返回顶楼 | |
发表时间:2011-03-22
既然是tcp用推送到方式算了么,服务端一旦有更新直接向各个客户端推送,然后客户段接受,保存,再关闭时替换一下原有文件不行么!!!
|
|
返回顶楼 | |
发表时间:2011-03-23
观察者模式
|
|
返回顶楼 | |
发表时间:2011-03-23
一般客户端不这样做,大多是运行的时候检测是否有最新,然后更新,再重新加载...
|
|
返回顶楼 | |