Maven编译源jar依赖项

时间:2011-09-15 14:30:32

标签: maven jar compilation

假设我有一个使用可在Maven存储库中找到的依赖项的项目。但是,还可以说,将要下载的jar文件不是适合我的项目的格式(例如,如果我的maven项目是一个Android项目,并且jar已经以dex工具不喜欢的方式编译) 。我想要做的是下载该依赖项的源版本。但是,一旦我添加了java-source,就不再能从我自己的源代码访问这些类了。我希望maven下载源jar并编译其中的java文件,并将编译后的类文件放在classpath中。这可能吗?

我唯一的选择是自己创建一个包含该库的新项目,但这很麻烦。

2 个答案:

答案 0 :(得分:11)

您可以执行以下操作:

  1. 使用maven dependency pluginunpack目标并将相关内容放入文件夹
  2. 使用build-helper-maven-pluginadd-source目标将此文件夹添加为源文件夹
  3. 以下是一些代码段...

    <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>
    

答案 1 :(得分:0)

使用Maven下载源包非常简单:

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

如何配置Maven以扩展此依赖关系然后编译它的内容超出了我的范围....

您是否考虑过ANT解决方案? ivy plug-in为其提供类似Maven的功能,groovy plug-in可用于编写特殊构建逻辑的脚本:

的build.xml

Ivy使用“配置”(类似于Maven范围)来分组依赖关系。

在此示例中,“sources”配置包含下载的源包。它们被放置在引用的文件集中,可以由groovy任务按顺序处理。

每个下载的源jar都解压缩到“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模块的“sources”范围。

<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>