我有一个Maven项目mjbean只有一个依赖项:TestA。这是mjbean的pom.xml:
<groupId>com.mbean</groupId>
<artifactId>mjbean</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>bundle</packaging>
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Main-Class>com.mbean.Main</Main-Class>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Import-Package>*</Import-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<name>mjbean</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.testa</groupId>
<artifactId>TestA</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
主要课程非常简单:
package com.mbean;
import com.testa.Testcl;
public class Main {
public static void main(String[] args) {
Testcl tcl = new Testcl();
tcl.testmethod();
}
}
我在maven-bundle-plugin中指定了主类<Main-Class>com.mbean.Main</Main-Class>
。它与Eclipse运行良好。然后我使用Eclipse在目标文件夹中生成目标包。当我尝试在命令行中运行它时:java -jar mjbean-0.0.1-SNAPSHOT.jar
,我收到了这个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/testa/Testcl
at com.mbean.Main.main(Main.java:12)
Caused by: java.lang.ClassNotFoundException: com.testa.Testcl
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
任何人都可以帮我吗?
答案 0 :(得分:3)
接受的答案不正确,maven-bundle-plugin
执行support any manifest headers。标头是否是OSGI规范的一部分并不重要。
清单标题 - 任何以大写字母开头的指令都会出现在结果包的清单文件中;标题的值将由BND复制,扩充或生成,具体取决于指令。
问题中的配置是正确的。
<configuration>
<instructions>
<Main-Class>com.mbean.Main</Main-Class>
</instructions>
</configuration>
我想问题可能是加载了一个错误的jar(其他插件可能存在多个jar文件)或者可能存在一些内置或缓存问题,并且jar文件不是最新的。
答案 1 :(得分:1)
Main-Class isn't part of the OSGi bundle standard,我不相信maven-bundle-plugin会识别它。
您可以按照使用现有MANIFEST.MF文件的说明进行操作并添加说明
<_include>src/main/resources/META-INF/MANIFEST.MF</_include>
然后在该文件中包含您的Main-Class
指令。这有点笨拙,可能暗示你正在使用错误的工具来完成工作。如果你只需要一个可执行的jar文件,那么还有其他可能更合适的Maven插件,比如maven-jar-plugin。
答案 2 :(得分:0)
将以下内容添加到您的pom中的maven-bundle-plugin部分...
...
<configuration>
<archive>
<manifest>
<mainClass>your.main.Main</mainClass>
</manifest>
</archive>
...
此致 罗兰