【问题标题】:Maven bundle plugin - How to add main classMaven 捆绑插件 - 如何添加主类
【发布时间】:2013-03-11 22:38:10
【问题描述】:

我有一个 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 中指定了主类&lt;Main-Class&gt;com.mbean.Main&lt;/Main-Class&gt;。它在 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)

谁能帮我解决这个问题?

【问题讨论】:

    标签: java eclipse maven maven-bundle-plugin


    【解决方案1】:

    接受的答案不正确,maven-bundle-plugin 不正确,support any manifest headers。标头是否属于 OSGI 规范并不重要。

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

    问题中的配置是正确的。

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

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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • maven-jar-plugin 可以和 bundle-plugin 一起工作吗?是否可以同时使用jar-plugin指定主类和bundle-plugin生成bundle?
      • @Li' 不,我看到指定一个主类使用 bundle-plugin 的唯一方法是提供您自己的清单供其修改。
      • 我又做了一个测试。我在 pom.xml 中同时使用了 bundle-plugin 和 maven-assembly-plugin。但我没有在 bundle-plugin 中使用 。然后 maven install 创建两个文件:1 个没有任何依赖项的包和 1 个包含所有依赖项的 jar 文件。所以不可能让 bundle-plugin 和 assembly-plugin 一起工作来创建一个包含所有依赖项的 bundle,对吧?
      • @Li' 对。他们都有创建 jar 文件的工作。 bundle-plugin 是专门为 OSGi 设计的,所以如果你想做一些超出 OSGi 的东西(比如 Main-Class),你必须做一些事情。 maven-assembly、maven-jar 和其他一些为其他情况制作 jar(例如,当您想要构建可执行 jar 时)。
      • 这是另一个实验。我使用带有 的 bundle-plugin 来创建一个包含所有依赖项的包。当我检查清单时,我想知道为什么仍然有很多导入包,因为所有依赖项都已包含在内。然后我将此包部署到 osgi 容器,我收到错误:缺少这些导入包的导出包。
      【解决方案3】:

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

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

      问候 罗兰

      【讨论】:

        猜你喜欢
        • 2018-12-10
        • 2023-03-16
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        相关资源
        最近更新 更多