buckaroo icon indicating copy to clipboard operation
buckaroo copied to clipboard

Maven Support

Open nikhedonia opened this issue 6 years ago • 1 comments

Buck supports Java and downloads from Maven.

remote_file(
  name = 'httpmime-jar',
  sha1 = '54ffde537682aea984c22fbcf0106f21397c5f9b',
  url = 'mvn:org.apache.httpcomponents:httpmime:jar:4.3.4',
  out = 'httpmime.jar',
)

To implement Maven support, Buckaroo would need:

  1. to be able to parse maven uri's
  2. find and parse pom.xml manifest from maven
  3. fetch transitive dependencies
  4. generate an appropriate buck file on install

nikhedonia avatar Feb 12 '19 19:02 nikhedonia

Some more info: A maven repository has a predictable file-structure: http://central.maven.org/maven2/

A maven coordonate eg. com.google.guava:guava maps to http://central.maven.org/maven2/com/google/guava/guava

This folder contains several important files:

A listing of all available versions: http://central.maven.org/maven2/com/google/guava/guava/maven-metadata.xml

<metadata modelVersion="1.1.0">
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <versioning>
    <latest>27.1-jre</latest>
    <release>27.1-jre</release>
    <versions>
      <version>r03</version>
      <version>22.0-rc1-android</version>
      <version>18.0-android</version>
      <version>18.0-jre</version>
...

And foreach version eg. http://central.maven.org/maven2/com/google/guava/guava/22.0-rc1-android

the artefact: http://central.maven.org/maven2/com/google/guava/guava/22.0-rc1-android/guava-22.0-rc1-android.jar

And the Manifest: http://central.maven.org/maven2/com/google/guava/guava/22.0-rc1-android/guava-22.0-rc1-android.pom

Which includes a list of dependencies:


<dependencies>
  <dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>jsr305</artifactId>
  </dependency>
  <dependency>
    <groupId>com.google.errorprone</groupId>
    <artifactId>error_prone_annotations</artifactId>
  </dependency>
  <dependency>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>animal-sniffer-annotations</artifactId>
     <version>${animal.sniffer.version}</version>
   </dependency>

Some of the entries may refer to properties:

 <properties>
    <aaa.bbb.ccc>1.7</aaa.bbb.ccc>
  </properties>

Every file also has a corresponding .sha1: http://central.maven.org/maven2/com/google/guava/guava/22.0-rc1-android/guava-22.0-rc1-android.jar.sha1

  • How to wire up Maven with the Resolver:
  1. Define a Maven PackageIdentifer & Location
    • https://github.com/LoopPerfect/buckaroo/blob/master/buckaroo/PackageIdentifier.fs#L7
    • https://github.com/LoopPerfect/buckaroo/blob/master/buckaroo/PackageLocation.fs#L24
  2. Create a Maven Coordiate Parser
    • https://github.com/LoopPerfect/buckaroo/blob/master/buckaroo/PackageIdentifier.fs#L91
  3. Create a POM to Manifest translator
    • implement a function that maps maven-location to pom url
    • switch on location type fetch and translate file here: https://github.com/LoopPerfect/buckaroo/blob/master/buckaroo/DefaultSourceExplorer.fs#L295
  • How to wire things up with Buck:
  1. download artefact into cache folder
  2. copy artefact from cache folder to buckaroo/central/maven/org/maven2/com/google/guava/guava/22.0-rc1-android/

generate a BUCK file:

load('//buckaroo_macros.bzl', 'buckaroo_deps')
prebuilt_jar(
  name = 'guava-22.0-rc1-android-prebuilt',
  binary_jar = 'guava-22.0-rc1-android.jar',
  source_jar = 'guava-22.0-rc1-android.sources.jar', # optional
  javadoc_url = 'http://kentbeck.github.com/junit/javadoc/4.8/', # optional
)

java_library(
  name = 'guava-22.0-rc1-android',
  visibility = ['PUBLIC'],
  deps = buckaroo_deps()
)

https://buckbuild.com/rule/prebuilt_jar.html

nikhedonia avatar Mar 24 '19 15:03 nikhedonia