【问题标题】:How to run a .jar file, which contains OpenCV code and was created using ant, from command line?如何从命令行运行包含 OpenCV 代码并使用 ant 创建的 .jar 文件?
【发布时间】:2013-12-10 10:24:11
【问题描述】:

我正在尝试从 Ubuntu 控制台运行一个小型 java 类,其中包含这样的 OpenCV 代码:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;

class SimpleSample {

    static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

    public static void main(String[] args) {
        System.out.println("Welcome to OpenCV " + Core.VERSION);
        Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
        System.out.println("OpenCV Mat: " + m);
        Mat mr1 = m.row(1);
        mr1.setTo(new Scalar(1));
        Mat mc5 = m.col(5);
        mc5.setTo(new Scalar(5));
        System.out.println("OpenCV Mat data:\n" + m.dump());
    }
}

我使用 ant 构建了这个; build.xml 看起来像这样:-

<project name="SimpleSample" basedir="." default="rebuild-run">

    <property name="lib.dir"     value="/opencv-2.4.7/build/bin"/>
    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>

    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>

    <property name="main-class"  value="${ant.project.name}"/>


    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
    </target>

    <target name="jar" depends="compile">
         <mkdir dir="${jar.dir}"/>
         <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
             <manifest>
                 <attribute name="Main-Class" value="${main-class}"/>
             </manifest>
         </jar>
    </target>

    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <sysproperty key="java.library.path" path="/opencv-2.4.7/build/lib"/>
            <classpath>
                <path refid="classpath"/>
                <path location="${jar.dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>

    <target name="rebuild" depends="clean,jar"/>

    <target name="rebuild-run" depends="clean,run"/>

</project>

当给定命令“ant”时,代码产生以下输出:-

Buildfile: /opencv-2.4.7/samples/java/ant/build.xml

clean:
    [delete] Deleting directory /opencv-2.4.7/samples/java/ant/build

compile:
    [mkdir] Created dir: /opencv-2.4.7/samples/java/ant/build/classes
    [javac] Compiling 1 source file to /opencv-2.4.7/samples/java/ant/build/classes

jar:
    [mkdir] Created dir: /opencv-2.4.7/samples/java/ant/build/jar
    [jar] Building jar: /opencv-2.4.7/samples/java/ant/build/jar/SimpleSample.jar

run:
    [java] Welcome to OpenCV 2.4.7.0
    [java] OpenCV Mat: Mat [ 5*10*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x7fc23c1bbc90, dataAddr=0x7fc23c1bbd50 ]
    [java] OpenCV Mat data:
    [java] [0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
    [java]   1, 1, 1, 1, 1, 5, 1, 1, 1, 1;
    [java]   0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
    [java]   0, libdc1394 error: Failed to initialize libdc1394
    [java] 0, 0, 0, 0, 5, 0, 0, 0, 0;
    [java]   0, 0, 0, 0, 0, 5, 0, 0, 0, 0]

rebuild-run:

BUILD SUCCESSFUL
Total time: 3 seconds

但是当我尝试使用命令java -jar SimpleSample.jar 运行ant 上一步生成的.jar 文件时,会出现以下错误:-

Exception in thread "main" java.lang.NoClassDefFoundError: org/opencv/core/Core
    at SimpleSample.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.opencv.core.Core
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

我打算从命令行本身运行 SimpleSample.jar 文件,没有任何错误。有人可以告诉我我需要做什么才能做到这一点吗?

【问题讨论】:

    标签: java opencv ant jar noclassdeffounderror


    【解决方案1】:

    我通过将 OpenCV 库 jar 与我构建的 jar 打包来解决它。在 build.xml"jar" 目标中,我添加了一个 "zipgroupfileset" 属性,如下所示:-

    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="/home/krozona/dev/programs/apache-tomcat-7.0.47/webapps/Krozona/WEB-INF/lib/${ant.project.name}.jar" basedir="${classes.dir}">
            <zipgroupfileset dir="${lib.dir}" includes="**/*.jar"/>
        </jar>
    </target>
    

    【讨论】:

    • 当我这样做时,我得到一个no main manifest attribute, in SimpleSample.jar。你有没有得到类似的东西?并可能解决它?
    【解决方案2】:

    问题是你没有正确指定你的类路径,所以你的依赖关系可能没有正确捆绑。

    您必须更改您的 build.xml 文件。 将以下内容添加到您的 build.xml

    <path id="libraries.path">    
            <fileset dir="${lib.dir}">
                <include name="*.jar"/>
            </fileset>
    </path>
    
    <target name="jar" depends="compile">
             <mkdir dir="${jar.dir}"/>
             <mkdir dir="${jar.dir}/${lib.dir}"/>
             <copy todir="${jar.dir}/${lib.dir}" flatten="true">
                <path refid="libraries.path"/>
             </copy>
             <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
                 <manifest>
                     <attribute name="Main-Class" value="${main-class}"/>
                     <attribute name="Class-Path" value="${jar.dir}/${lib.dir}/YOUR_JARS"/>
                 </manifest>
             </jar>
    </target>
    

    希望这行得通。

    【讨论】:

    • 我应该在命令行输入什么?因为按照您所说的进行更改并在控制台上运行“java -jar SimpleSample.jar”后,它会给出相同的错误。
    • 您是否在 build.xml 类路径中指定了代码使用的所有 jar?
    • 它只使用一个,即“opencv-247.jar”,是的,我这样指定它:“"
    • 使用 -jar 运行 jar 不涉及任何类路径机制,因为 jar 文件是类路径。或者使用 shell 别名来启动 jar 或小脚本文件。
    猜你喜欢
    • 2010-11-15
    • 2013-03-29
    • 2018-06-23
    • 2012-06-29
    • 2011-05-08
    • 2013-04-18
    • 2018-07-20
    • 2010-10-29
    • 2020-01-07
    相关资源
    最近更新 更多