使用Maven编译源代码jar依赖

14
假设我有一个项目,使用了可以在Maven仓库中找到的依赖项。但是假设将要下载的jar文件不适合我的项目格式(例如,如果我的maven项目是一个Android项目,而该jar已经以dex工具不喜欢的方式编译)。相反,我想下载该依赖项的源代码版本。但是一旦我添加了java-source,我的源代码就无法再访问这些类了。我想让maven下载源jar并编译其中的Java文件,并将编译后的类文件放入类路径中。这可能吗?
我的唯一选择是自己创建一个包含该库的新项目,但这很麻烦。
2个回答

12
你可以这样做:
  1. 使用 Maven 依赖插件unpack 目标并将依赖的内容放入文件夹中
  2. 使用 build-helper-maven-pluginadd-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>

总的来说,这对我来说已经是一个可行的方法。然而,当我尝试它时,未打包的源代码无法编译,因为我正在解压缩的库需要其他依赖项,在编译过程中找不到它们 :( - MShekow
这对我有所帮助,因为我有一个共享的工件,其中包含各种生成的源代码(Java/C#/CPP)。在运行之前不清楚是否需要将解压缩的项目添加到依赖项列表中 - 但使用artifactItem则不需要。 - Greg Domjan
构建助手插件现在位于https://www.mojohaus.org/build-helper-maven-plugin/。 - watery

0

使用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任务按顺序处理。
每个已下载的源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>

嗨。我觉得这个解决方案对我来说有点太复杂了。我不想通过Ant来解决这个问题。无论如何,谢谢! :) - MShekow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接