Maven как агрегировать исходный код из зависимостей проекта

#maven #osgi

#maven #osgi

Вопрос:

Я использую maven-bundle-plugin для создания плагина osgi из зависимостей, отличных от osgi, и я хочу включить исходный код из этой зависимости в сборку проекта.

Это пример, когда я создаю пакет OSGI из jfreechart, и когда я публикую его, я хочу включить исходные коды jfreechart.

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.jfree.chart</groupId>
    <artifactId>com.netappsid.org.jfree.chart</artifactId>
    <version>1.0.13</version>
    <name>JFreeChart OSGI</name>
    <packaging>bundle</packaging>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Export-Package>org.jfree.chart.*;org.jfree.data.*</Export-Package>
                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
                        <Embed-Dependency>jfreechart;inline=true</Embed-Dependency>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.0.13</version>
                    <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>*</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>com.springsource.org.jfree</artifactId>
            <version>1.0.12</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>com.springsource.javax.servlet</artifactId>
            <version>2.5.0</version>
        </dependency>
    </dependencies>

</project>
  

Комментарии:

1. Используете ли вы IDE? Когда я запускаю Maven для этого POM, я получаю ожидаемый файл JAR, который содержит «META-INF …» и «org jfree …». Поскольку вы также использовали «Встроенную зависимость», я предполагаю, что вы также хотите включить JAR-файл jfreechart, и в этом случае удалите инструкцию «;inline = true», и это сработает.

2. этот pom работает, но я хочу добавить исходный код jfreechart с помощью maven-source-plugin в com.netappsid.org.jfree.chart-1.0.13-sources. jar, когда я его выпущу

3. Извините, я не понимал, что вам нужны фактические исходные файлы. Я не видел исходных файлов jfreechart ни в одном из репозиториев Maven, но вы можете загрузить их напрямую с их веб-сайта и использовать: <scope>system</scope> и <systemPath>${project.basedir}/lib/jfree-sources.jar</systemPath> для зависимости вместе с maven-source-plugin. Я не использовал его раньше, хотя это не помогло бы с этим. Извините за недоразумение.

Ответ №1:

У меня была такая же проблема. Вот что я в итоге сделал:

  1. распакуйте исходные тексты с помощью maven-dependency-plugin

     <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>unpack-sources</id>
          <goals>
            <goal>unpack</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/sources</outputDirectory>
            <artifactItems>
              <artifactItem>
                <groupId>commons-httpclient</groupId>
                <artifactId>commons-httpclient</artifactId>
                <version>3.1</version>
                <classifier>sources</classifier>
              </artifactItem>
            </artifactItems>
          </configuration>
        </execution>
      </executions>
    </plugin>
      
  2. прикрепите артефакт исходных текстов, созданный с помощью maven-assembly-plugin

     <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <id>source-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <descriptors>
              <descriptor>src.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>
      

    со следующим дескриптором (обратите внимание, что идентификатор дескриптора используется в качестве классификатора; артефакт прикреплен по умолчанию):

     <?xml version="1.0"?>
    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
      <id>sources</id>
      <includeBaseDirectory>false</includeBaseDirectory>
      <formats>
        <format>jar</format>
      </formats>
      <fileSets>
        <fileSet>
          <directory>${project.build.directory}/sources</directory>
          <outputDirectory>/</outputDirectory>
          <useDefaultExcludes>true</useDefaultExcludes>
        </fileSet>
      </fileSets>
    </assembly>
      

Ответ №2:

Если я вас правильно понимаю…

Мне пришлось самому упаковывать множество банок без osgi для использования в приложении OSGi. При использовании maven-bundle-plugin , если вы используете Export-Package в манифесте (или osgi.bnd файле), тогда его классы будут включены в созданный пакет.

Пример:

 Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ACME PostgreSQL Driver Bundle
Bundle-SymbolicName: com.acme.org.postgresql
Bundle-Version: 9.0.801.jdbc4

# NB: I've imported a little too much for what is required.
Import-Package: org.postgresql*;version="9.0-801.jdbc4", 
    javax*, 
    org.w3c.dom, 
    !org.ietf.jgss, 
    !org.dom.xml.views

Export-Package: org.postgresql*;version="9.0-801.jdbc4"

Private-Package: org.w3c.dom*, org.xml*, javax*
  

Здесь экспортированные пакеты будут включены в JAR из моих зависимостей Maven в POM.

Если вы также хотите включить JAR зависимостей, то вы можете использовать Embed-Dependency :

 Embed-Dependency: org.postgresql*;version="9.0-801.jdbc4"
Embed-Transitive: true
  

Если это то, что вы искали?

Тони

Комментарии:

1. Я уже использую maven-bundle-plugin, но когда я выпускаю проект, он не включает исходный код инструкции <Embed-Dependency> в myprojet-1.0.0-sources.jar

2. Все ли ваши другие поля попадают в ваш пакет выпуска, т. Е. Bundle-SymbolicName? Не могли бы вы добавить этот раздел вашего POM к вашему вопросу, пожалуйста, чтобы мы могли его увидеть?