javah 无法从 spring-context-3.0.3.jar 文件中找到依赖类

javah cannot find dependent classes from spring-context-3.0.3.jar file

正在使用 ANT 任务编译 java 类,然后使用

生成 .h 文件

javah [ version "1.7.0_55" ] on windows 7

以下是我的 build.xml

中的代码片段
...
<property name="build.dir"        value="./main/test_target"/>
<property name="classes.dir"      value="${build.dir}/classes"/>
<property name="external.lib.dir" value="./externalJars"/>  <!-- contains spring-context-3.0.3.jar file --> 
<property name="jni.output.dir"   value="${build.dir}/jniHeaders"/>
..
...
<target name="compile-header" depends="build">

    <exec executable="javah">
        <arg line="-classpath ${classes.dir};${external.lib.dir} -o ${jni.output.dir}/MyNativeImpl.h -verbose -force examples.MyNativeImpl"/>
    </exec>
</target>

...
..

但我无法生成 .h 文件并得到以下错误

Error: Class org.springframework.context.MessageSource could not be found.

即使我已将 "spring-context-3.0.3.jar" 添加到 externalJars 目录 => ${external.lib.dir}

我的 java 文件 MyNativeImpl.java 使用包 "import org.springframework.context.MessageSource; " Java 文件编译正常使用 ${external.lib.dir} 并且 MyNativeImpl.class 也在 ${classes.dir}

下生成

不确定我做错了什么!!

几乎花了 1 天时间在 SS 上搜索,但可以找到特定的解决方案。 我有许多来自 spring 框架的依赖 jar,可以在 ${external.lib.dir} 下完全编译我的应用程序因此想知道如何解决这个问题,而不是 JAVAH在 .jar 文件中查找类 !!

Surprisingly I have a work-around which is:

1. unzip the contents of pring-context-3.0.3.jar to CLASSES DIR  ${classes.dir}
2. now my ${classes.dir} has following contents
   a. examples/MyNativeImpl.class
   b. org/springframework/context/MessageSource.class  ( and other classes )

3. Now JAVAH doesn't complain and generate my MyNativeImpl.h

但我现在知道为什么当我使用 spring-context-3.0.3.jar 时找不到相同的 MessageSource.class ??

我是否遗漏了什么或者这是唯一的方法:-(非常感谢任何帮助。

提前致谢

此致, 维维克

在类路径中指定 jar 时,您必须列出每个 jar。包含 jar 的目录是不够的,它只适用于 类,解释了为什么你的变通方法有效。

我建议如下:

<path id="javah.path">
  <pathelement location="${classes.dir}"/>
  <fileset dir="${external.lib.dir}" includes="*.jar"/>
</path>

<pathconvert property="javah.classpath" refid="javah.path"/>

<exec executable="javah">
  <arg line="-classpath ${javah.classpath} -o ... />
</exec>

PS