Je me demandais quelle était la différence entre le temps de compilation et les dépendances d'exécution en Java. C'est lié au chemin de classe, mais en quoi diffèrent-ils? J'ai googlé mais je n'ai pas trouvé de réponse satisfaisante.
Merci Kunal
Je me demandais quelle était la différence entre le temps de compilation et les dépendances d'exécution en Java. C'est lié au chemin de classe, mais en quoi diffèrent-ils? J'ai googlé mais je n'ai pas trouvé de réponse satisfaisante.
Merci Kunal
Au moment de la compilation de la 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, comme l'appelant new
pour certaines 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'direct, reference.method()
de la 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 que le temps de 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):
package dependencies;
public class C { }
Dans A.java (génère A.class):
package dependencies;
public class A {
public static class B {
public String toString() {
C c = new C();
return c.toString();
}
}
public static void main(String[] args) {
if (args.length > 0) {
B b = new B();
System.out.println(b.toString());
}
}
}
Dans ce cas, A
a un moment de la compilation de la dépendance sur C
par B
, 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 d' java dependencies.A
, comme la JVM ne essayer de résoudre B
's la dépendance de l' C
quand il arrive à exécuter B 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.
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 la 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.
D'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éthode bar(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 d'interfaces 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.
Les dépendances Compiletime sont uniquement les dépendances (autres classes) que vous utilisez directement dans la classe que vous compilez. Les dépendances d'exécution couvrent les dépendances directes et indirectes de la classe que vous exécutez. Ainsi, les dépendances d'exécution incluent les dépendances de dépendances et toutes les dépendances de réflexion telles que les noms de classe dont vous disposez dans String
, mais qui sont utilisées dans Class#forName()
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.