Maven компилирует исходную jar-зависимость - PullRequest
13 голосов
/ 15 сентября 2011

Допустим, у меня есть проект, который использует зависимость, которую можно найти в репозитории Maven. Однако, давайте также скажем, что загружаемый файл jar НЕ имеет формат, подходящий для моего проекта (например, если мой проект maven - проект Android, а jar был скомпилирован так, как не нравится инструмент dex) , Вместо этого я хочу загрузить исходную версию этой зависимости. Однако, как только я добавляю java-source, классы больше не доступны из моего собственного исходного кода. Мне бы хотелось, чтобы maven загружал исходный jar-файл, компилировал внутри него java-файлы и помещал скомпилированные файлы классов в classpath. Это возможно?

Моя единственная альтернатива - создать новый проект, содержащий эту библиотеку, но это громоздко.

Ответы [ 2 ]

11 голосов
/ 16 сентября 2011

Вы можете сделать следующее:

  1. Используйте плагин зависимостей maven распакуйте цель и поместите содержимое зависимости в папку
  2. Используйте build-helper-maven-plugin add-source цель добавить эту папку в качестве исходной папки

Вот фрагмент кода ...

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <id>unpack</id>
      <phase>process-sources</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>my.group</groupId>
            <artifactId>my.artifact</artifactId>
            <version>my.artifact.version</version>
            <classifier>sources</classifier>
            <overWrite>false</overWrite>
            <outputDirectory>${project.build.directory}/my.artifact</outputDirectory>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.5</version>
  <executions>
    <execution>
      <id>add-source</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>add-source</goal>
      </goals>
      <configuration>
        <sources>
          <source>${project.build.directory}/my.artifact.source</source>
        </sources>
      </configuration>
    </execution>
  </executions>
</plugin>
0 голосов
/ 16 сентября 2011

Скачать исходные пакеты с помощью Maven очень просто:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    <classifier>sources</classifier>
</dependency>

Как настроить Maven для расширения этой зависимости, а затем скомпилировать ее содержимое, мне не хватает ...

Рассматривали ли вы решение ANT? Плагин ivy предоставляет ему возможности, подобные Maven, а плагин groovy можно использовать для создания сценария вашей специальной логики сборки:

build.xml

Ivy использует «конфигурации» (аналогичные областям Maven) для группировки зависимостей.

В этом примере конфигурация «sources» содержит загруженные исходные пакеты. Они помещаются в набор файлов, на который ссылаются, которые могут последовательно обрабатываться Groovy-задачей.

Каждый загруженный исходный файл распаковывается в каталог «build / src»:

<project name="demo" default="unzip-sources" xmlns:ivy="antlib:org.apache.ivy.ant">

    <property name="build.dir" location="build"/>
    <property name="src.dir"   location="${build.dir}/src"/>

    <target name="resolve">
        <ivy:resolve/>
        <ivy:cachepath pathid="build.path" conf="build"/>
        <ivy:cachefileset setid="sourcezips" conf="sources"/>
    </target>

    <target name="unzip-sources" depends="resolve">
        <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

        <groovy>
        project.references.sourcezips.each {
            ant.unzip(src: it, dest: properties["src.dir"])
        }
        </groovy>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

</project>

ivy.xml

Каждая зависимость пакета источника использует конфигурацию «sources». Это сопоставляется непосредственно с областью «источников» модуля Maven.

<ivy-module version="2.0">
    <info organisation="org.myspotontheweb" module="demo"/>
    <configurations>
        <conf name="build" description="ANT tasks"/>
        <conf name="sources" description="Source packages"/>
    </configurations>
    <dependencies>
        <!-- Build dependencies -->
        <dependency org="org.codehaus.groovy" name="groovy-all" rev="1.8.2" conf="build->default"/>

        <!-- Source dependencies -->
        <dependency org="log4j" name="log4j" rev="1.2.16" conf="sources"/>
        <dependency org="commons-lang" name="commons-lang" rev="2.6" conf="sources"/>
    </dependencies>
</ivy-module>
...