Le temps de compilation vs moment de l'Exécution de la Dépendance à Java
Quelle est la différence entre les temps de compilation et de l'exécution des dépendances en Java?
Elle est liée au chemin de classe, mais comment font-ils différents?
Vous devez vous connecter pour publier un commentaire.
Au moment de la compilation de dépendance: Vous avez besoin de la dépendance dans votre
CLASSPATH
pour compiler votre artefact. Elles sont produites parce que vous avez une sorte de "référence" de la dépendance codé en dur dans votre code, tel que l'appel denew
pour certains de la classe, l'extension ou la mise en œuvre de quelque chose (que ce soit directement ou indirectement), ou d'un appel de méthode à l'aide de l'directreference.method()
notation.Au moment de l'exécution de la dépendance: Vous avez besoin de la dépendance dans votre
CLASSPATH
pour exécuter votre artefact. Elles sont produites parce que vous exécutez le code qui accède à la dépendance (soit codé en dur dans un moyen ou par l'intermédiaire de la réflexion ou de quoi que ce soit).Bien qu'au moment de la compilation de dépendance implique généralement de l'exécution de la dépendance du temps, vous pouvez avoir un moment de la compilation la seule dépendance. Ceci est basé sur le fait que Java uniquement des liens de la classe des dépendances lors du premier accès à cette classe, donc si vous n'avez jamais accéder à une classe particulière au moment de l'exécution, car un chemin de code n'est plus jamais traversé, Java ignorer à la fois la classe et de ses dépendances.
Exemple de ce
Dans C.java (génère C.class):
Dans A.java (génère A.class):
Dans ce cas,
A
a un moment de la compilation de la dépendance surC
parB
, mais il n'aura qu'un temps d'exécution de la dépendance sur C si vous passer quelques paramètres lors de l'exécution dejava dependencies.A
, comme la JVM ne essayer de résoudreB
's de la dépendance surC
quand il arrive à exécuterB b = new B()
. Cette fonction permet de fournir au moment de l'exécution seules les dépendances de cours que vous utilisez dans vos chemins de code, et d'ignorer les dépendances du reste de la classe dans l'artefact.Un exemple facile est de regarder un api comme la servlet api. Pour faire de votre servlets compiler, vous avez besoin de la servlet-api.jar mais au moment de l'exécution de la servlet container fournit une implémentation de l'api servlet de sorte que vous n'avez pas besoin d'ajouter servlet-api.jar à votre classe d'exécution chemin.
Le compilateur a besoin le droit chemin de classe dans le but de compiler les appels à une bibliothèque (moment de la compilation des dépendances)
La JVM besoins le droit chemin de classe afin de charger les classes dans la bibliothèque que vous appelez (les dépendances d'exécution).
Ils peuvent être différents dans un couple des manières:
1) si votre classe C1 appels de bibliothèque de classe L1, L1 appels de la bibliothèque de la classe de L2, alors C1 a un temps d'exécution de la dépendance sur L1 et L2, mais seulement un moment de la compilation de la dépendance sur L1.
2) si votre classe C1 dynamiquement instancie une interface I1 l'aide de la Classe.forName() ou d'un autre mécanisme, et la mise en œuvre de la classe pour l'interface I1 est de classe L1, alors C1 a un temps d'exécution de la dépendance sur I1 et L1, mais seulement un moment de la compilation de la dépendance sur I1.
Autres "indirecte" dépendances qui sont les mêmes pour la compilation et à l'exécution:
3) votre classe C1 s'étend de la bibliothèque de classe L1, L1 implémente l'interface I1 et s'étend de la bibliothèque de la classe de L2: C1 a un moment de la compilation de la dépendance sur L1, L2, et I1.
4) votre classe C1 a une méthode
foo(I1 i1)
et une méthodebar(L1 l1)
où I1 est une interface et L1 est une classe qui prend un paramètre qui est l'interface I1: C1 a un moment de la compilation de la dépendance sur I1 et L1.En gros, pour faire quelque chose d'intéressant, vos besoins de la classe à l'interface avec d'autres classes et d'interfaces dans le classpath. La classe/interface graphique formé par l'ensemble de la bibliothèque interfaces les rendements de la compilation de la dépendance du temps de la chaîne. La bibliothèque implémentations de rendement au moment de l'exécution de la chaîne de dépendances. Notez que le temps d'exécution de la chaîne de dépendances est dépendant du temps ou de l'échec lent: si la mise en œuvre de la L1 dépend parfois de l'instanciation d'un objet de la classe de L2, et que seule classe est instanciée dans un scénario particulier, alors il n'y a pas de dépendance à l'exception dans ce scénario.
Java n'a pas de lien de rien au moment de la compilation. Il ne vérifie que la syntaxe à l'aide de la correspondance de classes qu'il trouve dans le CLASSPATH. Il n'est pas jusqu'à l'exécution que tout est mis en place et exécutés sur le chemin de la classe à l'époque.
Compile-time dépendances sont seulement les dépendances (autres classes) que vous utilisez directement dans la classe que vous soyez à la compilation. Les dépendances d'exécution couvre à la fois directe et indirecte des dépendances de la classe, vous êtes en cours d'exécution. Ainsi, les dépendances d'exécution comprend les dépendances des dépendances et de toute réflexion dépendances comme les noms de classe que vous avez dans un
String
, mais sont utilisés dansClass#forName()
.A
, B.jar avecB extends A
et C.jar avecC extends B
alors C.jar dépend de la compilation sur A.jar même si C une dépendance sur Un est indirecte.Pour Java, compiler dépendance est votre code source de la dépendance. Par exemple, si la classe A appelle une méthode de la classe B, alors A est dépendant de B au moment de la compilation depuis Un a à savoir sur B (type B) pour être compilé. L'astuce ici devrait être ceci: code Compilé n'est pas complète et le code de l'exécutable encore. Il comprend remplaçable adresses des symboles, des métadonnées) pour les sources qui ne sont pas encore compilé existants ou en externe des bocaux. Lors de la liaison, ces adresses doivent être remplacés par des adresses dans la mémoire. Pour le faire correctement, avec les bons symboles/adresses doit être créé. Et cela peut être fait avec le type de la classe (B). Je crois que c'est le principal de dépendance au moment de la compilation.
Exécution de dépendance est plus en rapport avec le débit réel de contrôle. Il involes réelle de la mémoire d'adresses. C'est une dépendance que vous avez lorsque votre programme est en cours d'exécution. Vous avez besoin de la classe B les détails ici comme des mises en œuvre, non seulement le type d'info. Si la classe n'existe pas, alors vous aurez RuntimeException et de la JVM va quitter.
Deux dépendances, de manière générale et ne devrait pas, le flux de la même direction. C'est une question de OO conception de si.
En C++, une compilation est un peu différent (pas juste-à-temps) mais il a un éditeur de liens trop. Ainsi, le processus peut être pensée similaire à Java, je suppose.