связанный исполняемый файл jar - не удалось найти основной класс

Я пытаюсь выполнить файл jar StartupUtil.jar, но он выдает ошибку «Не удалось найти и загрузить основной класс». Я посмотрел на другой подобный вопрос и попытался, но не мог понять, что не так.

Моя структура для созданного StartupUtil.jar:

->com.ihc.startup.util.StartupService

->META-INF/MANIFEST.MF

Содержание МАНИФЕСТА:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.2
Created-By: 1.7.0_79-b15 (Oracle Corporation)
Main-Class: com.ihc.startup.util.StartupService
Class-Path: C:\Users\tgupta12\workspace_new\IHC_Startup\lib\bson-3.0.1
 .jar C:\Users\tgupta12\workspace_new\IHC_Startup\lib\mongodb-driver-3
 .0.1.jar C:\Users\tgupta12\workspace_new\IHC_Startup\lib\mongodb-driv
 er-core-3.0.1.jar C:\Users\tgupta12\workspace_new\IHC_Startup\classes

Вот мой build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="Startup" default="build" basedir=".">
    <property file="./build.properties" />

    <path id="lib-classpath">
        <fileset dir="${libApp.dir}">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${bin.dir}"/>
    </path>

    <target name="build" description="Compile main source tree java files">
        <echo message="  Build Startup Utility" />
        <mkdir dir="${bin.dir}"/>

        <echo message="  Compiling source files" />
        <javac destdir="${bin.dir}" source="${versionJDK}" target="${versionTarget}" debug="true"
             deprecation="false" optimize="false" failonerror="true" includeantruntime="false">
            <src path="${src.dir}"/>
            <classpath refid="lib-classpath"/>
        </javac>
        <echo message="  ...Compilation of source files OK" />

        <echo message="  Generating JAR for Startup - StartupUtility.jar" />
        <delete file="${out.dir}/${startup-util-name}" />
        <!-- convert classpath to a flat list/string -->
        <pathconvert property="lib.classpath" pathsep=" ">
            <path refid="lib-classpath" />
            <!--<flattenmapper />-->
        </pathconvert>

        <jar destfile = "${out.dir}/${startup-util-name}" basedir = "${bin.dir}" includes = "**/*">
            <manifest >
                <attribute name="Class-Path" value="${lib.classpath}" />
                <attribute name="Main-Class" value="com.ihc.startup.util.StartupService"/>
            </manifest>
        </jar>
        <echo message="  ...JAR Created for Startup" />

    </target>

<target name="run" depends="build">
    <java jar="${out.dir}/${startup-util-name}" fork="true"/>
</target>

Below is my build.properties file:

#Directories
build.dir=build
src.dir=src
libApp.dir=lib
out.dir=out
web.dir=WebContent/WEB-INF
bin.dir=classes
webcontent.dir=WebContent

#File Name
war-file-name=StartupService.war
startup-util-name=StartupUtil.jar

#Target Properties
versionJDK=1.7
versionTarget=1.7

Когда он пытается выполнить целевой запуск, он дает

Ошибка: не удалось найти или загрузить основной класс com.ihc.startup.util.StartupService.


person anon    schedule 03.06.2015    source источник
comment
Ну существует ли этот класс? Это в файле jar?   -  person Jon Skeet    schedule 04.06.2015
comment
Да, он существует и находится в каталоге src и пакете com.ihc.startup.util. Он существует в файле jar, когда я извлекаю банку и проверяю ее содержимое, оно существует в com/ihc/startup/util/StartupService.class   -  person anon    schedule 04.06.2015
comment
Это только запуск, я сделал опечатку   -  person anon    schedule 04.06.2015
comment
Можете ли вы разместить копию этого jar-файла где-нибудь, чтобы мы могли попытаться воспроизвести его?   -  person Jon Skeet    schedule 04.06.2015
comment
Я не совсем вас понял, поэтому каждый раз, когда он выполняется, он удаляет банку и создает новый файл банки. Мы хотим, чтобы я сохранил резервную копию файла или что?   -  person anon    schedule 04.06.2015
comment
Что ж, если вы сможете опубликовать копию где-нибудь в Интернете (например, в Dropbox), это поможет нам ее воспроизвести. Конечно, если это не собственность.   -  person Jon Skeet    schedule 04.06.2015
comment
В качестве примечания, тот факт, что у вас есть абсолютные пути в Class-Path записях вашего манифеста, кажется мне плохой идеей.   -  person Jon Skeet    schedule 04.06.2015
comment
Да, вы правы, это не очень хорошая конвенция. Но я просто застрял с этой проблемой   -  person anon    schedule 04.06.2015
comment
Ну, пока мы не сможем воспроизвести проблему, вам будет трудно помочь, поэтому я предлагаю вам поработать над тем, чтобы найти способ, как мы можем это сделать.   -  person Jon Skeet    schedule 04.06.2015
comment
Я отправил zip-архив с банкой в ​​репозиторий git github.com/tugupta91/IHC_Startup.   -  person anon    schedule 04.06.2015


Ответы (1)


Я сильно подозреваю, что проблема в том, что он не может найти зависимости, что означает, что он не может правильно загрузить основной класс. Я никогда раньше не видел абсолютных имен файлов в манифесте, и я не уверен в том, как вы разбиваете строки (хотя это может быть допустимым). Учитывая, насколько непереносимо использовать абсолютные имена файлов, я настоятельно рекомендую вам использовать только относительные.

Измените свой манифест на просто:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.2
Created-By: 1.7.0_79-b15 (Oracle Corporation)
Main-Class: com.ihc.startup.util.StartupService
Class-Path: bson-3.0.1.jar mongodb-driver-3.0.1.jar mongodb-driver-core-3.0.1.jar

Затем поместите эти файлы jar в тот же каталог, что и StartupUtil.jar.

person Jon Skeet    schedule 04.06.2015
comment
Теперь это работает, я изменил имена на относительные и скопировал библиотеки в тот же каталог, что и StartupUtil.jar. Теперь он работает нормально. Я добавил часть в build.xml, чтобы скопировать библиотеки. Большое спасибо :) - person anon; 04.06.2015
comment
Есть ли способ, которым у меня есть несколько каталогов ex. lib, lib1 и все мои jar-файлы находятся внутри этого каталога, и я могу указать реальный путь в clasppath? - person anon; 23.06.2015
comment
@Tushar: Попробуйте, и если это не сработает, задайте новый вопрос с подробностями. - person Jon Skeet; 23.06.2015