簡體   English   中英

使用Apache Ant時,已部署的jar無法找到主類

[英]Deployed jar can't find the main class while using Apache Ant

我使用以下build.xml構建了一個jar文件:

<project name="sampleproject">
        <!--Source Directory-->
        <property name="src.dir" value="src" />
        <property name="deploy.name" value="samplejar.jar" />
        <property name="lib.dir" value="./lib" />
        <property name="deploy.dir" value="target" />
        <property name="compile.dir" value="target/classes" />


        <!--Define directory name for third party libraries-->
        <property name="jar-all" location="${lib.dir}" />

        <!--Fileset is a group of files, here **/* matches all jar files across all directory levels-->
        <fileset id="jars" dir="${jar-all}">
        </fileset>

        <!--Setting the classpath-->
        <path id="classpath">
            <fileset refid="jars" />
            <pathelement location="." />
            <pathelement location="${src.dir}" />
            <pathelement location="${compile.dir}" />
        </path>

        <path id="cp">
            <fileset refid="jars" />
        </path>

        <pathconvert property="classpath.path" refid="cp" pathsep=" " dirsep="/">
            <map from="${jar-all}" to="lib" />
        </pathconvert>

        <echo>${classpath}</echo>
        <!--Clean-->
        <target name="clean">
            <delete dir="${deploy.dir}" />
        </target>

        <!--Jar-->
        <target name="jar" depends="compile">
            <jar destfile="${deploy.dir}/${deploy.name}.jar" basedir="${compile.dir}">
                <manifest>
                    <attribute name="Main-Class" value="main.java.Main" />
                    <attribute name="Class-Path" value="${classpath.path}" />
                </manifest>
                <include name="${src.dir}/META-INF/persistence.xml" />
                <restrict>
                    <not>
                        <or>
                            <name name="**/*.RSA" />
                            <name name="**/*.SF" />
                            <name name="**/*.DSA" />
                        </or>
                    </not>
                    <archives>
                        <zips>
                            <fileset dir="lib" includes="**/*.jar" />
                        </zips>
                    </archives>
                </restrict>
            </jar>

        </target>

        <!--Compile-->
        <target name="compile">
            <mkdir dir="${compile.dir}" />
            <javac includeantruntime="false" srcdir="${src.dir}" destdir="${compile.dir}">

                <classpath refid="classpath" />
            </javac>
        </target>
    </project>

我的文件夾結構是這樣的:

.
./.settings
./bin
./bin/main
./bin/main/java
./bin/META-INF
./lib
./lib/aws
./lib/hibernate
./src
./src/main
./src/main/java
./src/META-INF
./target
./target/classes
./target/classes/main
./target/classes/main/java

我的MANIFEST.MF

Created-By: 1.8.0_45-b14 (Oracle Corporation)
Built-Date: ${TODAY}
Main-Class: main.java.Main
Class-Path: lib/activation.jar lib/aws/aws-java-sdk-1.3.2.jar lib/aws/
 httpclient-4.1.1.jar lib/aws/httpcore-4.4.1.jar lib/aws/mail-1.4.3.ja
 r lib/aws/stax-1.2.0.jar lib/aws/stax-api-1.0.1.jar lib/commons-beanu
 tils-1.8.3.jar lib/commons-codec-1.4.jar lib/commons-configuration-1.
 8.jar lib/commons-httpclient-3.0.1.jar lib/commons-io-2.1.jar lib/com
 mons-lang-2.4.jar lib/commons-logging-1.1.1.jar lib/hibernate/antlr-2
 .7.7.jar lib/hibernate/c3p0-0.9.1.jar lib/hibernate/commons-collectio
 ns-3.2.1.jar lib/hibernate/dom4j-1.6.1.jar lib/hibernate/hibernate-c3
 p0-4.0.1.Final.jar lib/hibernate/hibernate-commons-annotations-4.0.1.
 Final.jar lib/hibernate/hibernate-core-4.0.1.Final.jar lib/hibernate/
 hibernate-entitymanager-4.0.1.Final.jar lib/hibernate/hibernate-jpa-2
 .0-api-1.0.1.Final.jar lib/hibernate/javassist-3.15.0-GA.jar lib/hibe
 rnate/jboss-logging-3.1.0.CR2.jar lib/hibernate/jboss-transaction-api
 _1.1_spec-1.0.0.Final.jar lib/jackson-all-1.9.5.jar lib/log4j-1.2.16.
 jar lib/mail.jar lib/mongo-2.8.0.jar lib/morphia-0.99.jar lib/mysql-c
 onnector-java-5.1.12-bin.jar lib/mysql-connector-java-5.1.25-bin.jar 
 lib/org.json.jar lib/ymmi-utilities-2.0.jar

每當我運行生成的jar時,它都會給我, Error: Could not find or load main class main.java.Main

另外,我還想包括lib文件夾及其子文件夾,因為它包含運行jar所需的庫。

在給我之前, No Persistence provider for EntityManager named但我通過使用<include name="${src.dir}/META-INF/persistence.xml" />解決了這個問題。 我可能在哪里錯了?

您的問題是jar任務中的<include>元素。 我執行了您的腳本,並且Main.class文件未添加到jar中。 更換

<include

通過

<fileset dir="${src.dir}" includes="META-INF/persistence.xml" />

這樣,它將仍然添加位於$ {compile.dir}中的所有文件。

您是Java新手嗎? 通常,您將源文件放在src / main / java中,將資源放在src / main / resources中。 這些文件夾是類路徑的根文件夾,其含義是:如果您的項目類位於org.myproject包中,則將Main.java文件放在src / main / java / org / myproject / Main.java中您應該將屬性“ src.dir”設置為“ src / main / java”。

在src / main / resources中使用所有資源(=不需要編譯但必須在jar中可用的文件)時,jar任務中的fileset元素可能只是:

<fileset dir="scr/main/resources"/>

這樣,您計划添加到項目中的所有資源文件都會自動添加到jar中。

我為什么要告訴你這個? 如果有一天您會考慮使用maven而不是ant,則maven希望源位於src / main / java中,資源位於src / main / resources中。 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

關於其他從屬jar:現在將所有jar都包含兩次:使用jar中的<archives>元素添加其內容,並在manifest.mf文件的Class-Path屬性中定義它們。

如果您真的想構建一個包含所有相關文件的jar,則無需指定清單屬性Class-Path。

如果要讓jar文件僅包含文件並分別提供相關的jar,請執行以下操作:刪除jar任務中的<archives>元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM