5

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

我已经<Main-Class>com.mbean.Main</Main-Class>在 maven-bundle-plugin 中指定了主类。它在 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)

谁能帮我这个?

4

3 回答 3

4

接受的答案不正确,maven-bundle-plugin确实支持任何清单标头。标头是否属于 OSGI 规范并不重要。

清单标头- 任何以大写字母开头的指令都将出现在生成的捆绑包的清单文件中;标头的值将根据指令由 BND 复制、扩充或生成。

问题中的配置是正确的。

<configuration>
    <instructions>
        <Main-Class>com.mbean.Main</Main-Class>
    </instructions>
</configuration>

我猜问题可能是加载了错误的 jar(其他插件可能有多个 jar 文件),或者可能存在一些构建或缓存问题,并且 jar 文件不是最新的。

于 2014-10-19T08:10:37.587 回答
1

Main-Class不是 OSGi bundle standard 的一部分,我不相信 maven-bundle-plugin 可以识别它。

您可以按照说明使用现有的 MANIFEST.MF 文件并添加说明

<_include>src/main/resources/META-INF/MANIFEST.MF</_include>

然后Main-Class在该文件中包含您的指令。这有点笨拙,这可能表明您使用了错误的工具来完成这项工作。如果您只需要一个可执行的 jar 文件,还有其他可能更合适的 Maven 插件,例如maven-jar-plugin

于 2013-03-12T16:53:05.513 回答
0

将以下内容添加到您的 pom 中的 maven-bundle-plugin 部分...

   ...
    <configuration>
      <archive>
        <manifest>
           <mainClass>your.main.Main</mainClass>
        </manifest>
      </archive>
      ...

问候罗兰

于 2013-09-19T16:50:47.147 回答