81 votes

Durée de compilation vs dépendance au moment de l'exécution - Java

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

72voto

gpeche Points 8596
  • 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.

31voto

Martin Algesten Points 5915

Un exemple simple est de regarder une API comme l'API Servlet. Pour que vos servlets soient compilés, vous n'avez besoin que de servlet-api.jar, mais vous avez besoin d'un conteneur de servlets implémentant réellement l'application api.

27voto

Jason S Points 58434

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.

11voto

JOTN Points 4165

Java ne lie réellement rien au moment de la compilation. Il vérifie uniquement la syntaxe à l'aide des classes correspondantes trouvées dans CLASSPATH. Ce n'est qu'à l'exécution que tout est mis en place et exécuté sur la base du CLASSPATH à ce moment-là.

10voto

BalusC Points 498232

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.com

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.

Powered by:

X