【问题标题】:Java classes can't get the resources in JAR files that compiled with IKVMJava 类无法获取使用 IKVM 编译的 JAR 文件中的资源
【发布时间】:2011-12-01 18:28:54
【问题描述】:
我已经使用 ikvmc 成功转换了一个 java 库。 Java 库在其自身的 jar 文件中使用了一些资源。我可以访问这个 java 库的所有类,但是如果我调用一个调用 this.getClass().getResource() 的方法,它不会在程序集中或程序集中的 jar 文件中搜索这些资源。但是如果我将这些资源与程序集放在同一个文件夹中,它可以找到资源。但它并不是每次都能很好地工作。例如,如果我在网站项目 (mvc) 中引用程序集,它就找不到资源。我尝试将这些资源放到 bin 文件夹、根文件夹、视图文件夹等中。(请参阅我对这篇文章的评论) 所以我需要一个永久的解决方案。 java 库是一个开源项目。但我不想改变来源。因为编译项目需要eclipse、ant、3rd party libs等。同样在Java库的下一个版本中,我将不得不更改代码并编译它。 我看到了 ikvmc 的“资源”参数。但我找不到这方面的文档或示例。 现在我将尝试实现一个从调用getResource 方法的java 类派生的.net 类。然后我将覆盖调用 getResource 方法的方法。但这也不是一个永久的解决方案。

【问题讨论】:

  • 作为一种解决方法,我在 java 的 Logger 类中添加了一个文件处理程序,因此我将文件跟踪到此文件夹:C:\Program Files (x86)\Common Files\microsoft shared\DevServer\ 10.0 看来,它假定根文件夹为网络服务器的根文件夹。
  • 我添加了 -resource 参数,例如“-resource:path/to/file=path/to/file”。但它也没有奏效。我用反射器查看了编译程序集的内部,我看到了“resources.jar”,其中包含我用“-resource”参数添加的文件。但是java类也没有看到这个文件。

标签: .net embedded-resource ikvm


【解决方案1】:

我找到了解决方案。其实我已经找到我做错的地方了。首先,我已经像这样转换了 java 库:

ikvmc first.jar -target:library -out:main.library.dll ikvmc second.jar -target:library -out:second.dll -r:main.library.dll ikvmc third.jar -target:library -out:third.dll -r:main.library.dll

然后我将所有这些 dll 与 ILMerge 合并。问题不在于合并 dll。问题在于加载资源。加载器函数在主库中。第二个和第三个库使用主库中的这个加载器函数。所以加载器函数只搜索它的 jar 文件,即 first.jar。即使它们都在同一个合并的 dll 中,它也不会搜索其他 jar。所以我像这样改变了我的转换脚本:

ikvmc first.jar -target:library -out:merged.library.dll -sharedclassloader { second.jar } { third.jar }

所以,所有 jars 都与这一行命令合并。虽然我不再需要使用 ILMerge。 ikvmc 帮助页面中没有关于“sharedclassloader”的任何解释。我在this page找到了这个解释。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2019-03-15
    • 2018-06-04
    • 2018-10-18
    相关资源
    最近更新 更多