2017-09-01 1 views
0

J'essaye de construire un paquet de publication relativement autonome (disons que c'est un tarball, mais pourrait être un RPM/Deb) qui contient mon code (qui est empaqueté dans un pot), ainsi que des jars mon code a été compilé avec et utilise à l'exécution. (Disons que ce sont le même ensemble pour la simplicité.)Jars dépendant de l'empaquetage avec Bazel

J'ai MyPackage (qui a un tas de fichiers .java) et disons que cela dépend directement des pots externes A et B, et B dépend du pot externe C. Je reçois A, B et C de maven_jars.

Je l'ai déjà mis en place des règles comme celui-ci:

En MyPackage/BUILD:

java_library(
    name = "MyPackage", 
    srcs = glob(["src/main/java/**/*.java"]), 
    deps = ["//MyPackage/artifacts:compile_jars"], 
) 

et MyPackage/objets/BUILD:

java_library(
    name = "compile_jars", 
    visibility = ["//MyPackage:__pkg__"], 
    exports = ["libdeps_A", "libdeps_B"] 
) 
java_library(
    name = "libdeps_A", 
    exports = ["@org.someone.A//jar"], 
) 
java_library(
    name = "libdeps_B", 
    exports = ["@org.secondparty.B//jar", ":libdeps_C"], 
) 
java_library(
    name = "libdeps_C", 
    exports = ["@org.thirdperson.C//jar"], 
) 

Cependant, le libMyPackage construit .jar (comme prévu) ne contient pas les fichiers de libdeps_ [ABC], il ne contient que les fichiers .class des objets de src/main/java de MyPackage.

J'ai une autre règle qui utilise avec succès: MyPackage pour le mettre dans lib/dir de mon tarball. Ma question est de savoir s'il existe un moyen d'adresser l'ensemble des fichiers (jars) qui viennent de parcourir la // règle MyPackage/artefacts: compile_jars pour que je puisse les placer dans l'archive tar.

Cela semble très similaire à ce que fait la cible de sortie implicite _deploy.jar de java_binary. Je ne pense pas que je puisse l'utiliser, cependant, parce que mon point d'entrée n'a pas de routine "principale". (Il utilise onStart de Google Play)

Je pourrais certainement écrire une certaine automatisation qui ferait une autre forme de // MyPackage/artefacts: compile_jars cible hors de l'information qui est dans MyPackage/artefacts/BUILD, mais je me demande si je ré-invente une roue?

Merci, Sean

Répondre

1

Au meilleur de ma connaissance il n'y a pas un outil ubiquotous pour le faire.

Nous avons eu exactement le même problème (nous avons créé une jar-ball contenant le pot principal, la fermeture transitive complète, les fichiers de configuration et quelques autres) - Nous avons fini par écrire notre propre solution inspirée de JarCreator (mais écrit à partir de zéro car nous avions besoin d'autres fonctionnalités et n'avons pas besoin de certaines de leurs fonctionnalités et nous préférons scala).

Comme autre référence, vous pouvez voir rules_scala (_build_deployable) qui implémente un jar de déploiement dans skylark (il sera probablement plus facile à copier que les règles natives).

Un autre indice indiquant ce problème étant non résolu ce problème est de Bazel: Add zip directory skylark action