我刚创建了一个简单的java应用程序,它将为我们的数据库生成实体类。我将保存到本地光盘的那些java类。 到目前为止一切正常。
现在我想在主应用程序中的那些java类中生成一个JAR文件。我知道,我可以操作jar文件,我还读到了在运行时将类添加到jar文件中。
但在我的情况下,我的构建路径中没有类。我需要的是从刚创建的java文件创建类文件并将它们放入我的jar文件中。
这可能在我的java应用程序中吗?
我这样做的原因是我们的数据库会被许多人一直扩展,我不想手动将这些字段添加到我的实体。所以我想创建一个从我们的数据库中扫描systables的应用程序,并从这些信息中生成java实体文件。但是现在我需要在生成它们之后在类文件中编译这些java文件并将它们添加到我的最终jar文件中。
感谢您提供有关此问题的任何帮助和/或信息。
许多问候, Hauke
答案 0 :(得分:10)
请参阅课程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?