代码之家  ›  专栏  ›  技术社区  ›  Ky -

如何打开和运行编译后的Java文件?

  •  2
  • Ky -  · 技术社区  · 14 年前

    (请记住,.jar文件可能有多个带有main(String[]args)方法的类)

    (个人问题来自 IDE-Style program running )

    5 回复  |  直到 7 年前
        1
  •  4
  •   aioobe    14 年前

    这是一个又快又脏的 乱劈 为了跑步 全部的 在罐子里找到的主要方法。

    import java.io.*;
    
    class JarRunner {
    
        public static void main(String[] args) throws IOException,
                                                      ClassNotFoundException {
    
            File jarFile = new File("test.jar");
            URLClassLoader cl = new URLClassLoader(new URL[] {jarFile.toURL() });
            JarFile jf = new JarFile(jarFile);
    
            Enumeration<JarEntry> entries = jf.entries();
            while (entries.hasMoreElements()) {
                JarEntry je = entries.nextElement();
                String clsName = je.getName();
    
                if (!clsName.endsWith(".class"))
                    continue;
    
                int dot = clsName.lastIndexOf('.');
                Class<?> clazz = cl.loadClass(clsName.substring(0, dot));
                try {
                    Method m = clazz.getMethod("main", String[].class);
                    m.invoke(null, (Object) new String[0]);
                } catch (SecurityException e) {
                } catch (NoSuchMethodException e) {
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                }
            }
        }
    }
    

    JarFile.getManifest() .

        2
  •  3
  •   Thorbjørn Ravn Andersen    14 年前

    使用

    java -cp my.jar org.myorg.MyClass
    

    如果你想从我的课开始。如果 my.jar 有一个正确的MANIFEST.MF文件,指示可以使用的MyClass

    java -jar my.jar
    
        3
  •  2
  •   Ignacio Vazquez-Abrams    14 年前

    清单上写着罐子的名字 entry point .

        4
  •  1
  •   Tommy    14 年前

        5
  •  0
  •   Donz    14 年前

    我认为您的问题是关于您在编译时不知道外部类的规范的情况。我说得对吗?

    所以您需要使用反射API来创建必要类的实例并调用其方法。你可以看到上面的例子。