2011-12-15 136 views
4

我刚创建了一个简单的java应用程序,它将为我们的数据库生成实体类。那些java类我将保存到我的本地光盘。 到目前为止一切正常。运行时生成JAR文件

现在我想从我的主应用程序中的那些java类创建一个JAR文件。我知道,我可以操作jar文件,并且还可以在运行时阅读有关向jar文件添加类的信息。

但在我的情况下,我没有我的构建路径中的类。我需要的是从我刚刚创建的java文件创建类文件,并将它们放入我的jar文件中。

这是可能在我的Java应用程序?

我这样做的原因是我们的数据库会一直被很多人扩展,我不想将这些字段手动添加到我的实体中。所以我想创建一个应用程序来扫描我们数据库中的systables,并从这些信息中生成java实体文件。但现在我需要在生成类文件后将这些java文件编译并添加到我的最终jar文件中。

感谢您对此问题的任何帮助和/或信息。

许多问候, Hauke

+0

尝试在网上搜索“如何以编程方式创建JAR文件”;你应该找到很多使用[`java.util.jar.JarOutputStream`](http://docs.oracle.com/javase/6/docs/api/java/util/jar/JarOutputStream.html)或[` java.util.zip.ZipOutputStream`](http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipOutputStream.html)。 – maerics 2011-12-15 15:32:47

回答

8

见(使用的网络上,许多例子)类java.util.jar.JarOutputStream。例如:

FileOutputStream fout = new FileOutputStream("c:/tmp/foo.jar"); 
JarOutputStream jarOut = new JarOutputStream(fout); 
jarOut.putNextEntry(new ZipEntry("com/foo/")); // Folders must end with "/". 
jarOut.putNextEntry(new ZipEntry("com/foo/Foo.class")); 
jarOut.write(getBytes("com/foo/Foo.class")); 
jarOut.closeEntry(); 
jarOut.putNextEntry(new ZipEntry("com/foo/Bar.class")); 
jarOut.write(getBytes("com/foo/Bar.class")); 
jarOut.closeEntry(); 
jarOut.close(); 
fout.close(); 

当然,你的程序可能会检查文件系统和遍历目录和文件结构生成条目名称和内容,但这个例子说明的主要特点。不要忘记正确处理异常并关闭finally块中的流。

此外,请记住,manifest file只是“META-INF/MANIFEST.MF”中的条目,它只是一个文本文件,其格式规则按照manifest file specification

将Java源文件编译为Class文件是一项单独的任务,充满了其自身的复杂性,但类javax.tools.JavaCompiler是一个很好的起点。这个问题也是一个很好的介绍:How do I programmatically compile and instantiate a Java class?

+0

谢谢。这帮助了我很多,它现在正在工作!谢谢 !!! :-) – Hauke 2011-12-16 09:20:04