如何从Jar读取工作区中的Java文件?

如何从Jar读取工作区中的Java文件?,java,eclipse,jar,classpath,Java,Eclipse,Jar,Classpath,我有一个奇怪的场景,我让客户机编辑他的工作区中的几个类。我有一个可执行的jar,他将把它放在项目的lib文件夹中。在其中一个菜单中,它应该调用客户端在其工作区中编辑的java类 如何让Jar调用工作区中的Java类 ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-cp", "packagename.Class"); pb.directory(new File("preferred/working/directory")); P

我有一个奇怪的场景,我让客户机编辑他的工作区中的几个类。我有一个可执行的jar,他将把它放在项目的lib文件夹中。在其中一个菜单中,它应该调用客户端在其工作区中编辑的java类

如何让Jar调用工作区中的Java类

ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-cp", "packagename.Class"); 
pb.directory(new File("preferred/working/directory"));
Process p = pb.start();
这适用于main方法

或:

InputStream fileInputStream=newfileinputstream(“c:/…../TestClass.class”);
字节rawBytes[]=新字节[fileInputStream.available()];
fileInputStream.read(rawBytes);
类REGENADCLASS=this.defineClass(“testpack.TestClass”,rawBytes,0,rawBytes.length);
println(regeneratedClass.getMethod(“getSimpleMethod”,null).invoke(regeneratedClass.newInstance(),null));

你的场景很奇怪;你应该考虑一个不同的设计。

当客户在eclipse中运行代码时:检查客户正在使用的“run”配置就足够了。有一个“Classpath”选项卡,您可以使用它来指定本地编译的类优先于提供给客户的JAR

如果他是从命令行运行您的应用程序,那么您必须提供相应的类路径——确保那些“本地覆盖”位于包含类的“旧”版本的JAR之前

作为替代方案,您可以提供构建脚本/指导,允许客户构建重新打包的JAR文件

编辑:


您是否可以提供JAR文件,而不提供应该来自客户的类?如果类仅存在于客户工作区中。。。至少您不必担心将使用哪个版本的类(因为只有一个版本!)

实际上,他只需双击我提供的可执行jar即可。在jar内部,一个类将调用客户机的类(工作区中的类)。我需要编写jar内部的代码,以便它读取工作区中的文件。@naveenbharadwaj我不确定是否可以这样做。您可以使用JAR清单文件来操作类路径(请参阅),但我不确定是否可以确保这些额外的类路径元素优先于JAR中的类。(这就是你现在的问题:客户是否有更新的类文件并不重要——如果类加载器首先在JAR中搜索,它总是从那里加载类。我不想从java文件执行JAR。我的JAR已经是一个可执行的JAR。客户只要双击它,UI就会打开。在其中一个菜单中,他说单击应该从用户工作区调用类的内容。
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));