【发布时间】:2016-04-05 16:27:00
【问题描述】:
我正在尝试从 Android 工作室运行一个 jar。经过长时间的解决方法,jar 文件运行完美。
现在我需要从 android studio 中导出 jar 文件。我从 build/libs 文件夹中获取了 Jar 文件。
但问题是jar文件显示错误。
没有主清单属性,在“app.jar”中
所以我找到了这个解决方案。 Can't execute jar- file: "no main manifest attribute"
然后我阅读了 MANIFEST.MF 并将邮件类添加到该文件中。
jar {
manifest.attributes(
'Main-Class': "com.Remo.server.RemoServerApp"
)
}
在我的 gradle 中添加这些之后。我的 MANIFEST.MF 包含 MainClass。
但我仍然遇到同样的错误?我该如何解决这个问题?
注意:目标是我想从项目中导出一个 Runnable Jar 文件。
更新:
在 MANIFEST.MF 中添加 MainClass 之后。我遇到了以下错误。
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
清单版本:1.0
主类:com.Remo.server.RemoServerApp
更新 2
从您的解决方案中,我了解到我们需要将 remoprotocol jar 文件复制到 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 任务后,我也遇到了同样的错误。
【问题讨论】:
-
听起来您还需要将类路径添加到清单中。你能发布你的完整 manifest.mf 吗?
-
这个 jar 中是否包含
com/Remo/protocol/RemoConnection类?还是有任何外部依赖jar? -
@RaGe 我已将 build.gradle 文件中的协议模块作为依赖项引用。但它们不包含在我的 jar 文件中。如何添加它们?
-
您不必将协议模块捆绑在您的 jar 中。只要您的可运行 jar manifest.mf 中有一个类路径条目,您就可以将协议 jar 放在与可运行 jar 相同的文件夹中
标签: java android-studio intellij-idea gradle jar