2015-12-31 2 views
4

Я пытаюсь запустить банку из студии Android. После долгого обходного пути файл jar работает отлично.Экспорт файла Jar с атрибутом Manifest в Android Studio?

Теперь мне нужно экспортировать файл jar из студии Android. Я получил файл Jar из папки build/libs.

Но проблема в том, что файл jar показывает ошибку.

не главный атрибут манифеста, в "app.jar"

Так я нашел это решение. Can't execute jar- file: "no main manifest attribute"

Затем я прочитал о MANIFEST.MF & добавлен класс почты в этот файл.

jar { 
    manifest.attributes(
      'Main-Class': "com.Remo.server.RemoServerApp" 
    ) 
} 

После добавления в мою град. Мой MANIFEST.MF содержит MainClass.

Но я все еще получаю ту же ошибку? Как я могу это решить?

Примечание: Целью является то, что я хочу экспортировать файл Runnable Jar из проекта.

ОБНОВЛЕНИЕ:

После добавления MainClass в MANIFEST.MF. Я застрял с ошибкой ниже.

Exception in thread "main" java.lang.NoClassDefFoundError: com/Remo/protocol/RemoConnection 
    at com.Remo.server.RemoServerApp.<init>(RemoServerApp.java:33) 
    at com.Remo.server.RemoServerApp.main(RemoServerApp.java:97) 
Caused by: java.lang.ClassNotFoundException: com.Remo.protocol.RemoConnection 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 2 more 

MANIFEST.MF

Manifest-Version: 1,0
Main-Class: com.Remo.server.RemoServerApp

UPDATE 2

От вашего решения, что я понял, что нам нужно скопировать файл jar remoprotocol на remoserver.

remoserver проект Gradle файл

apply plugin: 'java' 

sourceSets { 
    main { 
     resources.srcDirs = ['src/main/resources'] 
    } 
} 

dependencies { 
    compile project(':remoprotocol') 
    compile files('libs/bluecove-2.1.1.jar') 
} 

jar { 
    manifest.attributes(
      'Main-Class': "com.remo.server.remoServerApp" 
    ) 
    manifest.attributes(
      'Class-Path': configurations.runtime.files.collect { it.getName() }.join(' ')) 
} 

task copyRTDependenciesToLib(type: Copy) { 
    into "$buildDir/output/lib" 
    from configurations.runtime 
} 

После запуска Gradle задачи также я получаю ту же ошибку.

+0

Звуки, как вам нужно добавьте путь к классу и ваш манифест. Можете ли вы опубликовать свой полный манифест.mf? – RaGe

+0

- это класс 'com/Remo/protocol/RemoConnection', содержащийся в этой банке? или есть ли какие-либо внешние банки с зависимостями? – RaGe

+0

@RaGe Я ссылался на модуль протокола в файле build.gradle как на зависимость. Но они не содержатся в моем файле jar. Как я могу добавить их? – user3467240

ответ

4

Сначала вы хотите скопировать все ваши временные зависимости в папку builddir/libs (или другую папку рассылки, если вы так решите).Вот задача выполняется, что бы добиться этого:

task copyRTDependenciesToLib(type: Copy) { 
    into "$buildDir/libs" 
    from configurations.runtime 
} 

Добавьте ваши банки зависимостей времени выполнения в качестве атрибута Class-Path в вашем файле манифеста. Банки должны быть в том же каталоге, что и ваша исполняемая банка, - которая выше выполнила задача копирования. (В качестве альтернативы, вы можете обеспечить полный относительный путь для вашей зависимости местоположения баночки)

jar { 
    manifest { 
     attributes(
      "Main-Class": "com.Remo.server.RemoServerApp", 
      "Class-Path": configurations.runtime.files.collect { it.getName() }.join(' ')) 
     ) 
    } 
} 

Некоторые больше вещей, чтобы рассмотреть следующие вопросы:

  • application плагин делает то же самое; он добавляет задание installDist, которое создает набор исполняемых блоков, а также любые зависимости, любую документацию, которую вы хотите включить.

  • Если вы хотите, чтобы произвести один работоспособный банку без расслоения зависимостей вместе с ним, вы должны смотреть на создание «FatJar», например:

    task fatJar(type: Jar) { 
        manifest { 
         attributes 'Implementation-Title': 'Gradle Jar File Example', 
          'Implementation-Version': version, 
          'Main-Class': "com.Remo.server.RemoServerApp" 
        } 
        baseName = project.name 
    
        //collect all dependencies 
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
        with jar 
    } 
    
+0

Являются ли эти подпроекты под родительским проектом? Или независимые проекты? – RaGe

+0

В любом случае, а также потому, что могут быть и другие внешние зависимости, возможно, проще всего создать специальную задачу копирования для копирования всех зависимостей во время выполнения в папку build/lib вашего проекта runnable jar. – RaGe

+0

Возможно, вы также захотите собрать все банки с зависимостями в той же папке, что и runnable jar. Сделал изменения в своем ответе, чтобы отразить это. – RaGe

-1

У меня нет опыта работы с Android Studio (или Gradle), но у меня есть Java. Разве вы не пытаетесь установить основной класс?

Поэтому я предлагаю изменить атрибут Class-Path на Main-Class, поскольку манифест должен содержать Main-Class, чтобы иметь возможность вызывать что-то при запуске JAR.

+0

Это было опубликовано как ответ, но оно не пытается ответить на вопрос , Это должно быть редактирование, комментарий, другой вопрос или вообще исключить. –

+0

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

Смежные вопросы