OSGi, Modularité Java et Jigsaw

95

Donc, hier matin, je n'avais aucune idée de ce qu'était même OSGi. OSGi était juste un mot à la mode que je voyais sans cesse revenir, et j'ai donc finalement mis de côté un peu de temps pour le rafraîchir.

Cela semble en fait assez cool, donc je voudrais commencer par déclarer (pour mémoire) que je ne suis pas anti-OSGi en aucun cas, ni que ce n'est une question "OSGi-bashing".

En fin de compte, il semble qu'OSGi ait - essentiellement - abordé JSR 277 sur la modularité Java, qui a reconnu qu'il y avait des lacunes dans la JARspécification de fichier qui peuvent conduire à des problèmes de résolution d'espace de noms et de chargement de classe dans certains cas secondaires. OSGi fait aussi beaucoup d'autres trucs vraiment sympas, mais d'après ce que je peux vérifier, c'est son plus gros tirage (ou l'un d'entre eux).

Pour moi - en tant que développeur Java EE assez récent (quelques années maintenant), il est absolument ahurissant que nous soyons en 2011 et que nous vivions actuellement à l'ère de Java 7, et que ces problèmes de chargement de classe soient toujours présents; en particulier dans les environnements d'entreprise où un serveur d'applications peut contenir des centaines de fichiers JAR, dont beaucoup dépendent de différentes versions les uns des autres et s'exécutent tous (plus ou moins) simultanément.

Ma question:

Aussi intéressé que je suis par OSGi, et même si je veux commencer à en apprendre davantage pour voir où / si cela pourrait être utile à mes projets, je n'ai tout simplement pas le temps de m'asseoir et d'apprendre quelque chose d'aussi grand, Au moins maintenant.

Alors, que doivent faire les développeurs non OSGi lorsque ces problèmes surviennent? Quelles solutions Java (Oracle / Sun / JCP) existent actuellement, le cas échéant? Pourquoi Jigsaw a-t-il été coupé de J7? Dans quelle mesure la communauté est-elle sûre que Jigsaw sera implémenté l'année prochaine dans J8? Est-il possible d'obtenir Jigsaw pour votre projet même s'il ne fait pas encore partie de la plate-forme Java?

Je suppose que ce que je demande ici est une combinaison de panique, d'intrigue et de facepalm. Maintenant que je comprends enfin ce qu'est OSGi, je ne «comprends» pas comment quelque chose comme Jigsaw a mis plus de 20 ans à se concrétiser, et comment cela aurait pu être mis en conserve à partir d'une version. Cela semble juste fondamental.

Et, en tant que développeur, je suis également curieux de savoir quelles sont mes solutions, sans OSGi.

En outre, Remarque : Je sais que ce n'est pas une « programmation pur » question de type, mais avant certains d' entre vous obtenez votre nez courbé hors de forme, je voulais à l'autre (encore une fois, pour le dossier) que je délibérément mis cette question sur ALORS. C'est parce que je n'ai que le plus grand respect pour mes collègues SOers et je cherche une réponse au niveau architectural de certains des "Dieux de l'informatique" que je vois rôder ici chaque jour.

Mais, pour ceux d'entre vous qui insistent absolument pour qu'une question SO soit accompagnée d'un segment de code:

int x = 9;

(Merci à tous ceux qui peuvent peser sur ce truc OSGi / Jigsaw / classloader / namespace / JAR hell!)

IAmYourFaja
la source
Eh bien, Java 9 est là depuis hier, avec Jigsaw. Agréable à lire: Le top 10 du puzzle et les idées fausses sur Java 9 démystifiées
David Tonhofer

Réponses:

100

Comprenez d'abord que le principal cas d'utilisation de Jigsaw est de modulariser le JRE lui-même. En tant qu'objectif secondaire, il offrira un système de modules pouvant être utilisé par d'autres bibliothèques et applications Java.

Ma position est que quelque chose comme Jigsaw est probablement nécessaire pour le JRE uniquement, mais qu'il créera beaucoup plus de problèmes qu'il ne prétend en résoudre s'il est utilisé par d'autres bibliothèques ou applications Java.

Le JRE est un cas très difficile et particulier. Il a plus de 12 ans et est un désordre effrayant, criblé de cycles de dépendance et de dépendances absurdes. Dans le même temps, il est utilisé par environ 9 millions de développeurs et probablement des milliards de systèmes en cours d'exécution. Par conséquent, vous ne pouvez absolument pas refactoriser le JRE si ce refactoring crée des modifications avec rupture.

OSGi est un système de modules qui vous aide (ou même vous oblige à) à créer un logiciel modulaire. Vous ne pouvez pas simplement saupoudrer la modularité sur une base de code non modulaire existante. Transformer une base de code non modulaire en une base de code modulaire nécessite inévitablement une certaine refactorisation: déplacer les classes dans le bon package, remplacer l'instanciation directe par l'utilisation de services découplés, etc.

Cela rend difficile d'appliquer OSGi directement à la base de code JRE, mais nous avons toujours l'obligation de diviser le JRE en plusieurs parties ou "modules" afin que des versions réduites du JRE puissent être livrées.

Je considère donc Jigsaw comme une sorte de " mesure extrême " pour maintenir le code JRE vivant tout en le fractionnant. Cela n'aide pas le code à devenir plus modulaire, et je suis convaincu que cela augmentera en fait la maintenance nécessaire pour faire évoluer toute bibliothèque ou application qui l'utilise.

Enfin: OSGi existe alors que Jigsaw n'existe pas encore et peut ne jamais exister. La communauté OSGi a 12 ans d'expérience dans le développement d'applications modulaires. Si vous êtes sérieusement intéressé par le développement d'applications modulaires, OSGi est le seul jeu en ville.

Neil Bartlett
la source
Est-ce toi aussi? slideshare.net/mfrancis/... presque le même contenu.
Jin Kwon
Il existe également des modules JBoss: docs.jboss.org/author/display/MODULES/Introduction Il est également utilisé par Ceylon (ceylonlang.org). Voir ce fil sur le forum des utilisateurs de Ceylan: groups.google.com/forum/?hl=de#!topic/ceylon-users/RmDskLDNkug
OlliP
La déclaration finale: "Si vous êtes sérieusement intéressé par le développement d'applications modulaires, OSGi est le seul jeu en ville" tient toujours?
Adam Arold
1
@AdamArold Je pense que oui. Jigsaw n'existe toujours dans aucune version publiée de Java. JSR 376 (Java Platform Module System) forme toujours son groupe d'experts et n'a même pas encore commencé sur un premier projet. Java 9 n'est pas attendu pour plus d'un an, et même une fois sorti, il n'est pas garanti d'avoir la modularité (il a glissé de Java 7, puis de Java 8, et pourrait facilement glisser à nouveau). Enfin, les exigences publiées pour JSR376 indiquent que l'interopérabilité OSGi est nécessaire ... donc l'adoption d'OSGi reste un choix sûr, et aujourd'hui le seul choix pratique.
Neil Bartlett
2
@AdamArold D'accord, c'est une question un peu différente! On pourrait dire qu'OSGi est une architecture de microservices, mais je sais ce que vous dites. Pour moi, l'idée de modéliser chaque service en tant que processus est un problème beaucoup plus complexe, en termes de gestion et de sécurité et de frais généraux de communication. OSGi est plus simple et plus rapide. Cela dit, il est très facile d'utiliser OSGi Remote Services pour faire la transition des services vers et hors de la barrière de processus, donc je pense que c'est un bon choix pour une technologie de mise en œuvre pour les microservices.
Neil Bartlett
21

C'est simple, si vous voulez faire un véritable développement basé sur des composants en Java aujourd'hui, OSGi est le seul jeu en ville.

À mon avis, Jigsaw est une combinaison d'un compromis entre ce qui est faisable dans le JDK et les mauvaises relations précédentes entre SUN et les gars de l'OSGi. Peut-être qu'il sera livré avec Java 8, mais nous devons attendre et voir.

OSGi n'est pas une panacée si vous travaillez dans un environnement d'entreprise typique et vous devrez vous familiariser avec le fonctionnement du chargement de classe car un certain nombre de bibliothèques bien connues (en vous regardant, Hibernate) ont émis des hypothèses sur la visibilité des classes qui ne sont plus valides à l'intérieur d'OSGi.

J'aime OSGi, mais je n'essaierais pas de l'adapter à un système existant. Je pèserais également les avantages et les inconvénients en termes de développement greenfield - je recommanderais de regarder les produits Apache ou Eclipse qui simplifient la vie d'OSGi et de ne pas tout faire vous-même.

Si vous ne faites pas OSGi, alors vous n'avez pas de chance si vous avez trouvé un système qui a des dépendances sur différentes versions de la même bibliothèque - tout ce que vous pouvez faire est d'essayer d'éviter le problème, même si vous avez besoin de plusieurs versions d'un la bibliothèque me semble une «odeur» d'architecture.

SteveD
la source
Oui, je pensais qu'il y avait beaucoup de «mauvais sang» entre Sun et l'OSGi Alliance. Je ne peux pas imaginer Oracle va laisser les choses échapper à leur contrôle, cependant. Vous me dites vraiment qu'il n'y a pas de plans pour vraiment remédier (pas pirater) ce truc de l'enfer JAR de si tôt? Cela me souffle!
IAmYourFaja
6
@Mara Ce n'est pas vraiment juste de dire qu'il y a du mauvais sang. Après tout, Sun était l'un des co-créateurs d'OSGi il y a environ 12 ans (JSR 8). Sun a également rejoint l'OSGi Alliance en tant que membre à part entière, environ un an avant l'acquisition d'Oracle. Ils ont également développé pas mal de logiciels en plus d'OSGi, pré-Oracle. L'exemple le plus évident est Glassfish. Cependant, il est juste de dire qu'il existe des frictions entre certaines personnes chez Sun / Oracle et OSGi.
Neil Bartlett
15

J'adore votre utilisation de l'expression «cas de coin» pour décrire la situation actuelle.

il y a des lacunes dans la spécification du fichier JAR qui peuvent entraîner des problèmes de résolution d'espace de noms et de chargement de classe dans certains cas secondaires

Quoi qu'il en soit, depuis de nombreuses années, je m'intéresse aux outils et techniques qui prennent en charge la création et, mieux encore, font appliquer un code plus propre, plus découplé, plus cohérent et plus maintenable que ce qui aurait probablement été le résultat sans eux. Test Driven Design et Junit était une telle combinaison.

Après avoir passé quelques mois à déplacer une partie substantielle de notre base de code vers OSGi, je dirais qu'OSGi est un outil encore meilleur à cet égard. Et c'est vraiment une raison suffisante pour passer à OSGi. À long terme, cela vous fera économiser beaucoup d'argent.

Et, en prime, cela vous donnera une chance de faire beaucoup de choses sympas. Imaginez, lors d'une démo, mettre à jour en toute transparence le module d'authentification, sans perte de trafic, pour prendre en charge OAuth ... c'est soudain à nouveau un plaisir de créer des choses!

quarante-deux
la source