【问题标题】:Maven compile a source jar dependencyMaven编译一个源jar依赖
【发布时间】:2011-11-17 22:53:28
【问题描述】:

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

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

【问题讨论】:

    标签: maven jar compilation


    【解决方案1】:

    您可以执行以下操作:

    1. 使用maven dependency pluginunpack目标并将依赖项的内容放入文件夹中
    2. 使用build-helper-maven-pluginadd-source 目标将此文件夹添加为源文件夹

    这是一些代码 sn-p...

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

    【讨论】:

    • 总的来说,这对我来说已经是一种可行的方法。但是,当我尝试它时,解压后的源代码无法编译,因为我正在解压的这个库需要其他依赖项,并且在编译过程中找不到它们:(
    • 这对我有一个简单的案例很有帮助,我有一个共享工件,其中包含生成的各种源 (Java/C#/CPP)。直到我运行它之前还不清楚是否需要将解压缩的项目添加到依赖项列表中 - 使用 artifactItem 你不需要。
    • Build Helper 插件现在位于https://www.mojohaus.org/build-helper-maven-plugin/
    【解决方案2】:

    使用 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 范围)对依赖项进行分组。

    在此示例中,“源”配置包含下载的源包。这些被放入一个引用的文件集中,可以由 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

    每个源包依赖项都使用“源”配置。这直接映射到 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>
    

    【讨论】:

    • 嗨。我想这个解决方案对我来说有点太复杂了。我不想通过 Ant 来解决这个问题。不管怎么说,多谢拉! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多