我有这个奇怪的场景,我让客户端在他的工作区中编辑几个类。我有一个可执行jar,他将放在项目的lib文件夹中。在其中一个菜单中,它应该调用客户端在其工作区中编辑的java类。
如何让Jar调用工作区中的Java类?
答案 0 :(得分:2)
ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-cp", "packagename.Class");
pb.directory(new File("preferred/working/directory"));
Process p = pb.start();
这适用于主要方法。
或者:
InputStream fileInputStream = new FileInputStream("c:/..../TestClass.class");
byte rawBytes[] = new byte[fileInputStream.available()];
fileInputStream.read(rawBytes);
Class<?> regeneratedClass = this.defineClass("testpack.TestClass",rawBytes, 0, rawBytes.length);
System.out.println(regeneratedClass.getMethod("getSimpleMethod", null).invoke(regeneratedClass.newInstance(), null));
答案 1 :(得分:0)
你的情景非常奇怪;你应该考虑一个不同的设计。
当客户在eclipse中运行代码时:它可能足以检查&#34;运行&#34;您的客户正在使用的配置。有一个&#34; Classpath&#34; tab - 您可以使用它来指定本地编译的类优先于给予客户的JAR。
如果他从命令行运行您的应用程序,那么您必须提供相应的类路径 - 确保那些&#34;本地覆盖&#34;来到JAR前面,其中包含了#34;年龄较大的&#34;类的版本。
作为替代方案,您可以提供构建脚本/指南,允许客户构建重新打包的JAR文件。
编辑:
您是否有可能提供您的JAR文件没有应该来自客户的类?如果类只存在于客户工作区...至少你不必担心将使用哪个版本的类(因为它们只有一个版本!)