我已经安装了一个应用程序,当我试图运行它(它是一个可执行的jar)什么都没有发生。当我从命令行运行它时:
Java -jar "app.jar"
我得到了以下信息:
在“app.jar”中没有主清单属性
通常,如果我自己创建了这个程序,我就会向清单文件添加一个主类属性。但在这种情况下,由于文件来自应用程序,我不能这样做。我还尝试提取jar,看看是否能找到主类,但有很多类,没有一个在它的名称中有“main”这个词。必须有一种方法来修复这个问题,因为程序在其他系统上运行良好。
我已经安装了一个应用程序,当我试图运行它(它是一个可执行的jar)什么都没有发生。当我从命令行运行它时:
Java -jar "app.jar"
我得到了以下信息:
在“app.jar”中没有主清单属性
通常,如果我自己创建了这个程序,我就会向清单文件添加一个主类属性。但在这种情况下,由于文件来自应用程序,我不能这样做。我还尝试提取jar,看看是否能找到主类,但有很多类,没有一个在它的名称中有“main”这个词。必须有一种方法来修复这个问题,因为程序在其他系统上运行良好。
当前回答
我在使用IntelliJ IDEA创建一个罐子时遇到了这个问题。请看这个讨论。
解决这个问题的方法是重新创建jar工件,选择jar > From依赖模块,但不接受META-INF/MANIFEST.MF的默认目录。将-/src/main/java改为-/src/main/resources。
否则,它会在jar中包含一个清单文件,而不是- src/main/java中应该包含的清单文件。
其他回答
我只想明确一点
Main-Class: <packagename>.<classname>
如果你没有包,你必须忽略这部分,就像这样:
Main-Class: <classname>
我今天也遇到了同样的问题。我的问题解决了,我移动META-INF到资源文件夹。
或者,你也可以使用maven-assembly-plugin,如下面的例子所示:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.package.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
在这个例子中,节中指定的所有依赖jar都将自动包含在您的单个jar中。注意,jar-with-dependencies应该按字面意思写为,而不是替换为您想要包含的jar文件名。
只需将其添加到java模块的build.gradle中。它将创建可执行jar。 它将包含存档中的依赖库。
jar {
manifest {
attributes "Main-Class": "com.company.application.Main"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
这将导致[module_name]/build/libs/[module_name].jar文件。 我用shell进行了测试。
你可以简单地遵循这一步 创建一个jar文件
jar -cfm jarfile-name manifest-filename Class-file name
在运行jar文件时,像这样简单地运行
java -cp jarfile-name main-classname