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

时间:2015-01-09 06:57:49

标签: spring ant javah

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

生成.h文件
  

javah [版本" 1.7.0_55" ]在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.

即使我添加了&#34; spring-context-3.0.3.jar&#34; to externalJars dir =&gt; $ {external.lib.dir}

我的java文件MyNativeImpl.java使用package&#34; import org.springframework.context.MessageSource; &#34; 使用$ {external.lib.dir}和MyNativeImpl.class也可以在$ {classes.dir}下生成Java文件编译

不确定我做错了什么!!

几乎花了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?

我有什么遗漏或这是唯一的方法:-(任何帮助都非常感激。

先谢谢

此致 的Vivek

1 个答案:

答案 0 :(得分:1)

在类路径上指定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