2
我已经使用 ikvmc 成功转换了一个 java 库。Java 库在其自身的 jar 文件中使用了一些资源。我可以访问这个 java 库的所有类,但是如果我调用一个调用 this.getClass().getResource() 的方法,它不会在程序集中或程序集中的 jar 文件中搜索这些资源。但是如果我将这些资源与程序集放在同一个文件夹中,它可以找到资源。但它并不是每次都能很好地工作。例如,如果我在网站项目 (mvc) 中引用程序集,它就找不到资源。我尝试将这些资源放到 bin 文件夹、根文件夹、视图文件夹等(请参阅我对这篇文章的评论)

所以我需要一个永久的解决方案。java 库是一个开源项目。但我不想改变来源。因为编译项目需要eclipse、ant、3rd party libs等。同样在Java库的下一个版本中,我将不得不更改代码并编译它。

我看到了 ikvmc 的“资源”参数。但我找不到这方面的文档或示例。

现在我将尝试实现一个从调用getResource 方法的java 类派生的.net 类。然后我将覆盖调用 getResource 方法的方法。但这也不是一个永久的解决方案。

4

1 回答 1

3

我找到了解决方案。其实我已经找到我做错的地方了。首先我已经像这样转换了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 }

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

于 2011-10-06T12:35:11.127 回答