2013-10-10 11 views
63

मैं android-library प्रोजेक्ट की जार पैकेजिंग कैसे जारी कर सकता हूं?
मुझे पता चला है, class.jar build/bundles/release/classes.jar के तहत स्थित है और मुझे लगता है कि यह सही जार पैकेज है (इसमें *.class फ़ाइलें हैं)।एंड्रॉइड लाइब्रेरी ग्रैडल रिलीज JAR

क्या कुछ आधिकारिक तरीका है, पुस्तकालय को एएआर के बजाय जार के रूप में रिलीज़ करने के लिए?

संपादित
मैं Gradle Maven कलाकृतियों जारी करने के लिए उपयोग करते हैं, और मैं आर पैकेज के साथ जार जारी करने के लिए करना चाहते हैं। तो हस्ताक्षर, md5, प्रकट साथ जार, ...
https://chris.banes.me/2013/08/27/pushing-aars-to-maven-central/

apply plugin: 'maven' 
apply plugin: 'signing' 

configurations { 
    archives { 
     extendsFrom configurations.default 
    } 
} 

def sonatypeRepositoryUrl 
if (isReleaseBuild()) { 
    println 'RELEASE BUILD' 
    sonatypeRepositoryUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" 
} else { 
    println 'DEBUG BUILD' 
    sonatypeRepositoryUrl = "https://oss.sonatype.org/content/repositories/snapshots/" 
} 

if(!hasProperty('nexusPassword')) { 
    ext.set('nexusPassword', System.console().readPassword("\n\$ Type in password for Sonatype nexus account " + nexusUsername + ": ")) 
} 

if(!signing.hasProperty('password')) { 
    ext.set('signing.password', System.console().readPassword("\n\$ Type in GPG key password: ")) 
} 

afterEvaluate { project -> 
    uploadArchives { 
     repositories { 
      mavenDeployer { 
       beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } 

       pom.artifactId = POM_ARTIFACT_ID 

       repository(url: sonatypeRepositoryUrl) { 
        authentication(userName: nexusUsername, password: nexusPassword) 
       } 

       pom.project { 
        name POM_NAME 
        packaging POM_PACKAGING 
        description POM_DESCRIPTION 
        url POM_URL 

        scm { 
         url POM_SCM_URL 
         connection POM_SCM_CONNECTION 
         developerConnection POM_SCM_DEV_CONNECTION 
        } 

        licenses { 
         license { 
          name POM_LICENCE_NAME 
          url POM_LICENCE_URL 
          distribution POM_LICENCE_DIST 
         } 
        } 

        developers { 
         developer { 
          id "loopj" 
          name "James Smith" 
         } 
         developer { 
          id "smarek" 
          name "Marek Sebera" 
         } 
        } 
       } 
      } 
     } 
    } 

    signing { 
     required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } 
     sign configurations.archives 
    } 

    task androidJavadocs(type: Javadoc) { 
     source = android.sourceSets.main.java.srcDirs 
    } 

    task androidJavadocsJar(type: Jar) { 
     classifier = 'javadoc' 
     from androidJavadocs.destinationDir 
    } 

    task androidSourcesJar(type: Jar) { 
     classifier = 'sources' 
     from android.sourceSets.main.java.srcDirs 
    } 

    artifacts { 
     archives androidSourcesJar 
     archives androidJavadocsJar 
    } 
} 

task androidJar(type: Jar) { 
    from android.sourceSets.main.java.srcDirs 
} 

का उपयोग कर केवल जावा फ़ाइलें पैकेज होगा पर आधारित है, संकलित नहीं और Android SDK

उत्तर

91

जबकि के खिलाफ जुड़ा हुआ मैंने सोनाटाइप (या यहां तक ​​कि एक स्थानीय रेपो) को तैनाती के साथ कलाकृतियों को अपलोड करने की कोशिश नहीं की है, वैसे ही मैं उसी समस्या से निपटने की कोशिश करते समय a few weeks ago के साथ आने में कामयाब रहा हूं।

./gradlew jarRelease 
+0

मुझे डर है, यह सही जवाब है :-) धन्यवाद, मैं इसे अंतिम संपादन पोस्ट करूंगा जिसे मैंने इसे काम करने के लिए बनाया है –

+4

मैं यह भी पुष्टि कर सकता हूं कि यह काम करता है। ध्यान दें कि जेनरेट किया गया कार्य ** 'gradle functions' ** चलाते समय दिखाई नहीं देता है, केवल ** 'gradle functions --all' ** के साथ। एक बार फिर धन्यवाद! – CommonsWare

+6

धन्यवाद यह मदद करता है, लेकिन यह अभी भी निर्भरताओं के लिए कक्षा फाइलें उत्पन्न नहीं करता है।मैं मूल रूप से एक एसडीके जार बनाने की कोशिश कर रहा हूं जो बाहर निकलने के लिए एक सिंगल जार होगा, लेकिन इस संकलन में मॉड्यूल प्रोजेक्ट्स शामिल नहीं हैं जो निर्भर है और निर्भरता अनुभाग आदि से जार नहीं खींचता .. क्या आपके पास कोई है इसे पूरा करने के लिए सुझाव जहां यह पुस्तकालय परियोजनाओं को जार में भी संकलित करता है, इसलिए मुझे प्रत्येक लाइब्रेरी प्रोजेक्ट के लिए 4 जारों को सौंपना नहीं है। तो यह पता लगाना अच्छा होगा कि मैसन निर्भरता जार को भी जीसन या ओटो जैसे कैसे शामिल किया जाए। – Sam

2

एक और तरीका है के माध्यम से Gradle इस प्रकार है एक पुस्तकालय परियोजना से एक जार उत्पन्न करने के लिए:

अपनी लाइब्रेरी के build.gradle में:

def jarName = 'someJarName.jar' 

task clearJar(type: Delete) { 
    delete "${project.buildDir}/libs/" + jarName 
} 

task makeJar(type: Copy) { 
    from("${project.buildDir}/intermediates/bundles/release/") 
    into("${project.buildDir}/libs/") 
    include('classes.jar') 
    rename('classes.jar', jarName) 
} 

makeJar.dependsOn(clearJar, build) 

android.libraryVariants.all { variant -> 
    def name = variant.buildType.name 
    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) { 
    return; // Skip debug builds. 
    } 
    def task = project.tasks.create "jar${name.capitalize()}", Jar 
    task.dependsOn variant.javaCompile 
    task.from variant.javaCompile.destinationDir 
    artifacts.add('archives', task); 
} 

तो निम्नलिखित चलाने

हम यहां क्या कर रहे हैं बस एंड्रॉइड ग्रैडल प्लगइन द्वारा उत्पन्न कक्षाओं की प्रतिलिपि बना रहा है। इस फ़ाइल के लिए अपनी बिल्ड निर्देशिका में देखना सुनिश्चित करें और देखें कि इसकी सामग्री आपके इच्छित तरीके से है या नहीं।

फिर makeJar कार्य चलाने के लिए और जिसके परिणामस्वरूप जार पुस्तकालय/निर्माण/libs में होगा/${jarName} .jar

रिलीज के लिए आपके विन्यास के अनुसार वर्ग फ़ाइलों होगा। यदि आप इसे खराब कर रहे हैं, तो जार में फाइलों को खराब कर दिया जाएगा।

0

सिर्फ इसलिए कि पिछले उत्तर मेरी ज़रूरतों को पूरा नहीं कर रहे थे, इसलिए मैं प्रोजेक्ट क्लास और आर्ल/जार निर्भरताओं के साथ एक जार उत्पन्न करने के लिए अपना मुश्किल संस्करण साझा करता हूं।

// A tricky jar operation, we want to generate a jar files that contains only the required classes used. 
// Dependencies are in jar and aar, so we need to open the aar to extract the classes and put all at the same level 
// (aar is a zip that contains classes.jar, the latter is a zip that contains .class files) 
task jar(type: Jar) { 
    from { 
     List<File> allFiles = new ArrayList<>(); 
     configurations.compile.collect { 
      for (File f : zipTree(it).getFiles()) { 
       if (f.getName().equals("classes.jar")) { 
        allFiles.addAll(zipTree(f).getAt("asFileTrees").get(0).getDir()) 
       } 
      } 
     } 
     allFiles.add(new File('build/intermediates/classes/release')) 
     allFiles // To return the result inside a lambda 
    } 
    archiveName(project.ext.appName + '.jar') 
} 

यह निर्माण प्रकार/जायके का प्रबंधन नहीं करता है लेकिन अनुकूलित किया जा सकता है (यह स्वाद के बिना निर्माण प्रकार रिलीज पर निर्माण करने के लिए बस ठीक है)।

यदि कभी भी आपके पास एक बेहतर या अधिक सुरुचिपूर्ण समाधान है, तो कृपया साझा करें!

संबंधित मुद्दे