java compile - Comment ajouter la dépendance du fichier.jar local au fichier build.gradle?




project tutorial (13)

Vous pouvez essayer de réutiliser votre dépôt Maven local pour Gradle:

  • Installez le fichier jar dans votre référentiel Maven local:

    mvn install:install-file -Dfile=utility.jar -DgroupId=com.company -DartifactId=utility -Dversion=0.0.1 -Dpackaging=jar

  • Vérifiez que le ~/.m2/ jar est installé dans votre référentiel Maven ~/.m2/ local

  • Activez votre référentiel Maven local dans votre fichier build.gradle :

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      compile ("com.company:utility:0.0.1")  
    }
    
    • Vous devriez maintenant avoir le jar activé pour la compilation dans votre projet

J'ai donc essayé d'ajouter ma dépendance de fichier .jar locale à mon fichier build.gradle:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

dependencies {
    runtime files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
} 

Et vous pouvez voir que j'ai ajouté les fichiers .jar dans le dossier referencedLibraries ici: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries

Mais le problème est que lorsque j'exécute la commande: gradle build sur la ligne de commande, j'obtiens l'erreur suivante:

error: package com.google.gson does not exist
import com.google.gson.Gson;

Voici mon repo entier: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1


Selon la documentation , utilisez un chemin relatif pour une dépendance de jar locale comme suit:

dependencies {
    compile files('libs/something_local.jar')
}

Un moyen simple de le faire est

compile fileTree(include: ['*.jar'], dir: 'libs')

il va compiler tous les fichiers .jar dans votre répertoire libs dans App.


La meilleure façon de le faire est d'ajouter ceci dans votre fichier build.gradle et de cliquer sur l'option sync

dependency{
    compile files('path.jar')
}

La question a déjà reçu une réponse détaillée. Je veux toujours ajouter quelque chose qui me semble très surprenant:

La tâche "Gradle dependencies" ne répertorie aucune dépendance de fichier. Même si vous le pensez, car ils ont été spécifiés dans le bloc "dépendances" après tout.

Donc, ne comptez pas sur la sortie de ceci pour vérifier si vos fichiers lib locaux référencés fonctionnent correctement.


La solution qui a fonctionné pour moi est l'utilisation de fileTree dans le fichier build.gradle. Conservez le fichier .jar qui doit être ajouté en tant que dépendance dans le dossier libs. Donnez le code ci-dessous dans le bloc dependenices dans build.gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Aller à Fichier -> Structure du projet -> Modules -> app -> Onglet Dépendances -> Cliquer sur + (bouton) -> Sélectionner la dépendance du fichier -> Sélectionner le fichier jar dans le dossier lib

Cette étape ajoutera automatiquement votre dépendance à Gralde

Très simple


La réponse acceptée est bonne, cependant, j'aurais eu besoin de diverses configurations de bibliothèque dans ma compilation Gradle multi-projets pour utiliser la même bibliothèque Java tierce.

L'ajout de ' $ rootProject.projectDir ' à l'élément de chemin ' dir ' dans ma fermeture ' allprojects ' signifiait que chaque sous-projet faisait référence au même répertoire ' libs ', et non à une version locale de ce sous-projet:

//gradle.build snippet
allprojects {
    ...

    repositories {
        //All sub-projects will now refer to the same 'libs' directory
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }

    ...
}

EDIT par Quizzie: a changé "$ {rootProject.projectDir}" en "$ rootProject.projectDir" (fonctionne dans la version la plus récente de Gradle).


Je ne pouvais pas obtenir la suggestion ci-dessus à https://.com/a/20956456/1019307 pour travailler. Cela a fonctionné pour moi cependant. Pour un fichier secondstring-20030401.jar que j'ai stocké dans un répertoire libs/ à la racine du projet:

repositories {
    mavenCentral()
    // Not everything is available in a Maven/Gradle repository.  Use a local 'libs/' directory for these.
    flatDir {
       dirs 'libs'
   }
}

...

compile name: 'secondstring-20030401'

Autrement:

Ajouter une bibliothèque dans l'arborescence. Faites un clic droit sur celui-ci. Sélectionnez le menu "Ajouter comme bibliothèque". Une boîte de dialogue apparaît, vous permet de sélectionner le module. OK et c'est fait.


Si vous avez vraiment besoin de prendre ce fichier .jar à partir d'un répertoire local,

Ajouter à côté de votre module gradle (pas le fichier gradle de l'application):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   compile name: 'gson-2.2.4'
}

Cependant, étant un .jar standard dans un référentiel maven réel, pourquoi ne pas essayer cela?

repositories {
   mavenCentral()
}
dependencies {
   compile 'com.google.code.gson:gson:2.2.4'
}

Vous pourriez également faire ceci qui inclurait tous les fichiers JAR dans le référentiel local. De cette façon, vous n'auriez pas à le spécifier à chaque fois.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Ceci est une optimisation du compilateur JIT (pas d'optimisation du compilateur Java).

Si vous comparez le code d'octet généré par le compilateur Java pour les deux versions, vous verrez que la boucle est présente dans les deux versions.

Voici à quoi ressemble la méthode décompilée avec println:

private static void loop() {
    long value = 0L;

    for(int j = 0; j < '썐'; ++j) {
        for(int i = 0; i < 100000000; ++i) {
            ++value;
        }
    }

    System.out.println("Done " + value);
}

Voici à quoi ressemble la méthode décompilée lorsque println est supprimé:

private static void loop() {
    long value = 0L;

    for(int j = 0; j < '썐'; ++j) {
        for(int i = 0; i < 100000000; ++i) {
            ++value;
        }
    }
}

Comme vous pouvez le voir, les boucles sont toujours là.

Cependant, vous pouvez activer la journalisation et l’assemblage des compilateurs JIT avec les options JVM suivantes:

-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation -XX:+PrintAssembly

Vous devrez peut-être également télécharger le hsdis-amd64.dylib et le placer dans votre répertoire de travail (MacOS, HotSpot Java 8).

Après avoir exécuté le TestClient, vous devriez voir le code produit par le compilateur JIT dans la console. Ici, je ne posterai que des extraits de la sortie.

Version sans println:

# {method} 'loop' '()V' in 'test/TestClient'
0x000000010e3c2500: callq  0x000000010dc1c202  ;   {runtime_call}
0x000000010e3c2505: data32 data32 nopw 0x0(%rax,%rax,1)
0x000000010e3c2510: sub    $0x18,%rsp
0x000000010e3c2517: mov    %rbp,0x10(%rsp)
0x000000010e3c251c: mov    %rsi,%rdi
0x000000010e3c251f: movabs $0x10dc760ec,%r10
0x000000010e3c2529: callq  *%r10              ;*iload_3
                                              ; - test.TestClient::[email protected] (line 9)
0x000000010e3c252c: add    $0x10,%rsp
0x000000010e3c2530: pop    %rbp
0x000000010e3c2531: test   %eax,-0x1c18537(%rip)        # 0x000000010c7aa000
                                              ;   {poll_return}
0x000000010e3c2537: retq

Version avec println:

# {method} 'loop' '()V' in 'test/TestClient'
0x00000001092c36c0: callq  0x0000000108c1c202  ;   {runtime_call}
0x00000001092c36c5: data32 data32 nopw 0x0(%rax,%rax,1)
0x00000001092c36d0: mov    %eax,-0x14000(%rsp)
0x00000001092c36d7: push   %rbp
0x00000001092c36d8: sub    $0x10,%rsp
0x00000001092c36dc: mov    0x10(%rsi),%r13
0x00000001092c36e0: mov    0x8(%rsi),%ebp
0x00000001092c36e3: mov    (%rsi),%ebx
0x00000001092c36e5: mov    %rsi,%rdi
0x00000001092c36e8: movabs $0x108c760ec,%r10
0x00000001092c36f2: callq  *%r10
0x00000001092c36f5: jmp    0x00000001092c3740
0x00000001092c36f7: add    $0x1,%r13          ;*iload_3
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c36fb: inc    %ebx               ;*iinc
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c36fd: cmp    $0x5f5e101,%ebx
0x00000001092c3703: jl     0x00000001092c36f7  ;*if_icmpge
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c3705: jmp    0x00000001092c3734
0x00000001092c3707: nopw   0x0(%rax,%rax,1)
0x00000001092c3710: mov    %r13,%r8           ;*iload_3
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c3713: mov    %r8,%r13
0x00000001092c3716: add    $0x10,%r13         ;*ladd
                                              ; - test.TestClient::[email protected] (line 10)
0x00000001092c371a: add    $0x10,%ebx         ;*iinc
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c371d: cmp    $0x5f5e0f2,%ebx
0x00000001092c3723: jl     0x00000001092c3710  ;*if_icmpge
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c3725: add    $0xf,%r8           ;*ladd
                                              ; - test.TestClient::[email protected] (line 10)
0x00000001092c3729: cmp    $0x5f5e101,%ebx
0x00000001092c372f: jl     0x00000001092c36fb
0x00000001092c3731: mov    %r8,%r13           ;*iload_3
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c3734: inc    %ebp               ;*iinc
                                              ; - test.TestClient::[email protected] (line 8)
0x00000001092c3736: cmp    $0xc350,%ebp
0x00000001092c373c: jge    0x00000001092c376c  ;*if_icmpge
                                              ; - test.TestClient::[email protected] (line 8)
0x00000001092c373e: xor    %ebx,%ebx
0x00000001092c3740: mov    %ebx,%r11d
0x00000001092c3743: inc    %r11d              ;*iload_3
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c3746: mov    %r13,%r8
0x00000001092c3749: add    $0x1,%r8           ;*ladd
                                              ; - test.TestClient::[email protected] (line 10)
0x00000001092c374d: inc    %ebx               ;*iinc
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c374f: cmp    %r11d,%ebx
0x00000001092c3752: jge    0x00000001092c3759  ;*if_icmpge
                                              ; - test.TestClient::[email protected] (line 9)
0x00000001092c3754: mov    %r8,%r13
0x00000001092c3757: jmp    0x00000001092c3746
0x00000001092c3759: cmp    $0x5f5e0f2,%ebx
0x00000001092c375f: jl     0x00000001092c3713
0x00000001092c3761: mov    %r13,%r10
0x00000001092c3764: mov    %r8,%r13
0x00000001092c3767: mov    %r10,%r8
0x00000001092c376a: jmp    0x00000001092c3729  ;*if_icmpge
                                              ; - test.TestClient::[email protected] (line 8)
0x00000001092c376c: mov    $0x24,%esi
0x00000001092c3771: mov    %r13,%rbp
0x00000001092c3774: data32 xchg %ax,%ax
0x00000001092c3777: callq  0x0000000109298f20  ; OopMap{off=188}
                                              ;*getstatic out
                                              ; - test.TestClient::[email protected] (line 13)
                                              ;   {runtime_call}
0x00000001092c377c: callq  0x0000000108c1c202  ;*getstatic out
                                              ; - test.TestClient::[email protected] (line 13)
                                              ;   {runtime_call}

Vous devez également avoir le fichier hotspot.log avec les étapes du compilateur JIT. Voici un extrait:

<phase name='optimizer' nodes='114' live='77' stamp='0.100'>
            <phase name='idealLoop' nodes='115' live='67' stamp='0.100'>
                <loop_tree>
                    <loop idx='119' >
                        <loop idx='185' main_loop='185' >
                        </loop>
                    </loop>
                </loop_tree>
                <phase_done name='idealLoop' nodes='197' live='111' stamp='0.101'/>
            </phase>
            <phase name='idealLoop' nodes='197' live='111' stamp='0.101'>
                <loop_tree>
                    <loop idx='202' >
                        <loop idx='159' inner_loop='1' pre_loop='131' >
                        </loop>
                        <loop idx='210' inner_loop='1' main_loop='210' >
                        </loop>
                        <loop idx='138' inner_loop='1' post_loop='131' >
                        </loop>
                    </loop>
                </loop_tree>
                <phase_done name='idealLoop' nodes='221' live='113' stamp='0.101'/>
            </phase>
            <phase name='idealLoop' nodes='221' live='113' stamp='0.101'>
                <loop_tree>
                    <loop idx='202' >
                        <loop idx='159' inner_loop='1' pre_loop='131' >
                        </loop>
                        <loop idx='210' inner_loop='1' main_loop='210' >
                        </loop>
                        <loop idx='138' inner_loop='1' post_loop='131' >
                        </loop>
                    </loop>
                </loop_tree>
                <phase_done name='idealLoop' nodes='241' live='63' stamp='0.101'/>
            </phase>
            <phase name='ccp' nodes='241' live='63' stamp='0.101'>
                <phase_done name='ccp' nodes='241' live='63' stamp='0.101'/>
            </phase>
            <phase name='idealLoop' nodes='241' live='63' stamp='0.101'>
                <loop_tree>
                    <loop idx='202' inner_loop='1' >
                    </loop>
                </loop_tree>
                <phase_done name='idealLoop' nodes='253' live='56' stamp='0.101'/>
            </phase>
            <phase name='idealLoop' nodes='253' live='56' stamp='0.101'>
                <phase_done name='idealLoop' nodes='253' live='33' stamp='0.101'/>
            </phase>
            <phase_done name='optimizer' nodes='253' live='33' stamp='0.101'/>
        </phase>

Vous pouvez analyser davantage le fichier hotspot.log produit par le compilateur JIT à l'aide de l'outil JitWatch https://github.com/AdoptOpenJDK/jitwatch/wiki

Pour désactiver le compilateur JIT et exécuter la machine virtuelle Java en mode interprété, vous pouvez utiliser l'option -Djava.compiler = NONE JVM.

Une question similaire est dans cet article Pourquoi ma JVM effectue-t-elle une optimisation de la boucle d'exécution et fait-elle de mon code une erreur?







java gradle dependency-management build.gradle gradle-eclipse