【问题标题】:How to read Java files in workspace from a Jar?如何从 Jar 中读取工作区中的 Java 文件?
【发布时间】:2015-03-25 10:33:10
【问题描述】:

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

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

【问题讨论】:

    标签: java eclipse jar classpath


    【解决方案1】:
    ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-cp", "packagename.Class"); 
    pb.directory(new File("preferred/working/directory"));
    Process p = pb.start();
    

    这适用于 main 方法。

    或者:

    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)); 
    

    【讨论】:

    • 我不想从 java 文件中执行 Jar。我的 jar 已经是一个可执行的 jar。客户端只需双击它,用户界面就会打开。在其中一个菜单中,他单击了一些东西,这应该会从用户的工作区调用该类。
    【解决方案2】:

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

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

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

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

    编辑:

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

    【讨论】:

    • 实际上他只是双击我提供的可执行jar。在 jar 中,一个类将调用客户端的类(存在于工作区中的类)。我需要编写进入 jar 的代码,以便读取工作区中的文件。
    • @naveenbharadwaj 我不确定这是否可以做到。您可以使用 JAR 清单文件来操作类路径(请参阅 docs.oracle.com/javase/tutorial/deployment/jar/downman.html ),但是我不确定是否可以确保这些额外的类路径元素具有 优先级 在 JAR 中的类。 (这就是你现在的问题:客户是否有更新的类文件并不重要——如果类加载器首先在 JAR 中搜索,它总是会从那里加载类。
    猜你喜欢
    • 2011-03-23
    • 2010-09-29
    相关资源
    最近更新 更多