Maven bundle插件 - 如何添加主类

时间:2013-03-11 22:38:11

标签: java eclipse maven maven-bundle-plugin

我有一个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)

任何人都可以帮我吗?

3 个答案:

答案 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>
      ...

此致 罗兰