【问题标题】:how to exclude GWT dependency code from OSGI bundle generated by MAven+BND?如何从 MAven+BND 生成的 OSGI 包中排除 GWT 依赖代码?
【发布时间】:2011-11-14 04:39:18
【问题描述】:

我在根 pom.xml 文件中有几个具有 Vaadin 库依赖项的 Maven 模块。

我正在尝试使用 Maven+BND 构建一组 OSGI 包(每个 Maven 模块 1 个)。

我将此添加到我的“根”pom.xml 文件中:

    <dependencies>
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin</artifactId>
        <version>6.6.6</version>
    </dependency>
    <dependency>
        <groupId>com.google.gwt</groupId>
        <artifactId>gwt-user</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>1.0.0</version>
    </dependency>
    </dependencies>

不幸的是,生成的 JAR 文件(包)包含 GWT (com.google.gwt) 类。这 1) 使捆绑包很大,有很多重复的依赖项。 2) 生成数千条关于“拆分包”的构建警告。

问题:如何防止将 GWT 类添加到我的 Jar 文件中?

我尝试将 GWT 的“范围”设置为“提供”,将“类型”设置为“捆绑”,甚至 optional=true - 没有帮助。

这是我的根 pom.xml 的一部分,它负责 Vaadin/GWT 的东西:

    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.3.5</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Export-Package>mycompany.*</Export-Package>
                    <Private-Package>*.impl.*</Private-Package>
                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                    <!--                        <Bundle-Activator>com.alskor.publicpackage.MyActivator</Bundle-Activator>-->
                </instructions>
            </configuration>
        </plugin>
        <!-- Compiles your custom GWT components with the GWT compiler -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>gwt-maven-plugin</artifactId>
            <!-- Version 2.1.0-1 works at least with Vaadin 6.5 -->
            <version>2.3.0-1</version>
            <configuration>
                <!-- if you don't specify any modules, the plugin will find them -->
                <!--modules>
                    ..
                </modules-->
                <webappDirectory>${project.build.directory}/${project.build.finalName}/VAADIN/widgetsets
                </webappDirectory>
                <extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs>
                <runTarget>clean</runTarget>
                <hostedWebapp>${project.build.directory}/${project.build.finalName}</hostedWebapp>
                <noServer>true</noServer>
                <port>8080</port>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>resources</goal>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Updates Vaadin 6.2+ widgetset definitions based on project dependencies -->
        <plugin>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-maven-plugin</artifactId>
            <version>1.0.1</version>
            <executions>
                <execution>
                    <configuration>
                        <!-- if you don't specify any modules, the plugin will find them -->
                        <!--
                        <modules>
                            <module>${package}.gwt.MyWidgetSet</module>
                        </modules>
                        -->
                    </configuration>
                    <goals>
                        <goal>update-widgetset</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

【问题讨论】:

    标签: maven osgi vaadin


    【解决方案1】:

    我也遇到过类似的问题,因为最终的战争文件超过了将近 90MB! 罪魁祸首之一是前面提到的罐子,所以我这样做了:

    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>widgetset</artifactId>
            <version>3.2</version>
            <exclusions>
                <exclusion>
                    <groupId>com.vaadin.external.gwt</groupId>
                    <artifactId>gwt-user</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        ...
    </dependencies>
    

    【讨论】:

      【解决方案2】:

      Export-Package 和 Private-Package 语句中的通配符让我觉得非常危险。由于 Private-Package 中的 *.impl.* 模式,可能会拖入 GWT 包。

      此外,您应该永远在 Export-Package 中使用通配符:出口应该受到严格控制和版本控制。

      【讨论】:

      • 这是否意味着我不能在根文件中定义这个“mycompany.*”模式并且必须在每个模块中都有一些 BND 配置文件?
      • 另外,由于某些原因,我预计依赖项“type=bundle”不会包含在构建的 JAR 文件中,但我在这里肯定错了。当我将 Maven 依赖项设置为“捆绑”时,我看不到对打包的影响。它可能会影响 BND 从依赖项加载文件的方式,我不知道...
      • 回答您的第一个问题……这是一个有争议的问题。在我看来,导出的包非常重要,应该始终以明确且受控的方式完成。请记住,这些是您提供给消费者的 API,因此需要进行维护、版本控制等。私有包的问题不大,因为它们是私有的,但这里的通配符仍然是错误的来源。请仔细阅读有关使用这些说明的 Maven Bundle Plugin 文档!
      • 谢谢,尼尔。我现在有另一个问题,可能应该作为一个单独的问题发布:我可以启动 Equinox 服务器并访问 localhost:8080,但我的 Vaadin 应用程序无法访问(404)。我看到我的 webui.jar 包不包含任何 Vaadin 资源(图标/主题)。它只有类和 manifest.mf。如何使用 Maven+BND 将这些资源添加到捆绑包中?我正在使用标准的 Vaadin 项目布局:WebContent/META-INF WebContent/VAADIN WebContent/WEB-INF pom.xml 我尝试使用 Include-Resource: WebContent/Vaadin 将“bnd.bnd”文件添加到模块中 - 无更改
      • 我在 webui 模块 pom.xml 中添加了 'WebContent' 作为实验.现在资源已添加到 jar 中(Vaadin 小部件集除外),但无法启动捆绑包:来自“webui”的相同包被添加到 manifest.mf 中的“导出”和“导入”列表中另一个问题跨度>
      【解决方案3】:
      1. 使用 mvn dependency:tree 查看 gwt 依赖的来源
      2. 将带有适当&lt;exclude/&gt;&lt;excludes/&gt; 元素添加到相关依赖项以抑制它。

      【讨论】:

        猜你喜欢
        • 2011-07-07
        • 2016-09-21
        • 2012-10-12
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 2010-11-19
        • 2020-03-02
        • 2020-02-15
        相关资源
        最近更新 更多