Question

Il peut ne pas être la meilleure pratique, mais est-il possible de supprimer unsused classes à partir d'un tiers des fichiers jar.Quelque chose qui ressemble à la façon dont mes classes sont à l'aide de la bibliothèque et fait de la nature de l'analyse de la couverture, puis crache un autre pot avec tous de la nature intacte des classes supprimées.

Évidemment, il ya des problèmes avec cela.Plus précisément, le scénario d'utilisation je l'ai mis mais ne peuvent pas utiliser toutes les classes de tous les temps.

Mais en négligeant ces problèmes, peut-il être fait en principe?

Était-ce utile?

La solution

Il y a un moyen.

Le JarJar projet n'cette AFAIR.Le premier but de la JarJar projet est de permettre d'intégrer des bibliothèques tierces dans votre propre pot, la modification de la structure des paquets si nécessaire.Ce faisant, il est possible de traquer les classes qui ne sont pas nécessaires.

Consultez-le à l' http://code.google.com/p/jarjar/.

Voici un lien sur la réduction des pots: http://sixlegs.com/blog/java/jarjar-keep.html

Autres conseils

Il existe un outil dans Ant appelé classfileset.Vous spécifiez la liste des classes racines que vous savez que vous avez besoin, et puis le classfileset de manière récursive analyse leur code pour trouver toutes les dépendances.

Alternativement, vous pouvez développer une bonne suite de test qui exerce toutes les fonctions dont vous avez besoin, puis exécutez vos tests en vertu d'un outil de couverture de test.L'outil vous indiquera les classes (et de la déclaration de mer) ont été effectivement utilisé.Cela pourrait vous donner encore plus petit ensemble de code que ce que vous pouvez trouver avec l'analyse statique.

J'utilise ProGuard pour cela.Ainsi que d'être un excellent obfuscator, il a un code de rétrécissement de phase qui peut combiner plusieurs Pots, puis d'en extraire toutes les classes non utilisées ou les membres de la classe.Il en fait une excellent emploi à réduire.

Lors d'un précédent emploi, j'ai utilisé un Java obfuscator que ainsi que obfusquer le code, également supprimé les classes et les méthodes qui n'étaient pas utilisés.Si vous étiez en train de faire "de la Classe.byName" ou tout autre type de réflexion choses, vous avez besoin de dire à l'obfuscateur parce qu'il ne pouvait pas dire en inspectant le code des classes ou des méthodes appelées par la réflexion.

Le problème, bien sûr, est que vous ne savez pas si d'autres parties de la troisième partie de la bibliothèque sont en train de faire de toute réflexion, et donc de la suppression d'un "non utilisé" classe peut provoquer les choses pour les casser dans une obscure affaire que vous n'avez pas testé.

jar est juste un fichier zip, donc je suppose que vous le pouvez.Si vous pouviez remonter à la source, c'est plus propre.Peut-être essayer de démonter la classe?

En ajoutant à cette question, peut améliorer les performances?Depuis les classes non utilisées ne serait pas JIT compilé améliorer le temps de démarrage ou le java détecter automatiquement que lors de la compilation en bytecode et ne même pas faire face avec le code n'est pas utilisé?

Ce serait un projet intéressant (quelqu'un a déjà fait?)

Je présume que vous souhaitez donner à l'outil de votre pot(s) en tant que point de départ, et la bibliothèque pot à nettoyer.Il pourrait utiliser la réflexion pour déterminer les catégories de votre pot(s) de référence directement, et qui sont utilisés indirectement en bas de l'arbre d'appel (ce n'est pas anodin du tout, mais c'est faisable).Si elle rencontre une réflexion code dans les deux endroits, il devrait donner un très fort d'avertissement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top