Come si determinano quali vasi sono necessari per tali e tali funzionalità di un framework? Ad esempio, quali vasetti sarebbero necessari tra tutti quelli disponibili per Spring per supportare solo l'iniezione di dipendenza?Determinazione di quali vasetti minimi sono necessari per una funzione
risposta
Esistono strumenti che creano JAR minimi calcolando quali classi sono effettivamente utilizzate in un'applicazione analizzando staticamente il codice, quindi creando un nuovo JAR contenente solo quelle classi. (. Ricordo usando Zelix Classmaster per fare questo, ma ci sono molte alternative)
Il problema con l'utilizzo di questi strumenti per un quadro DI come Primavera includono:
l'unica traccia dipendenze statiche esistenti. Se si caricano dinamicamente le classi, è necessario comunicare specificatamente all'analizzatore ciascuna di esse. I framework DI in generale e Spring in particolare sono pieni di caricamento dinamico, incluso il caricamento dinamico opaco al codice dell'applicazione.
Gli strumenti esistenti funzionano creando un nuovo JAR di output, non specificando quale dei JAR di input non viene utilizzato. Mentre il reimballaggio dei JAR è OK se si sta creando un'applicazione con involucro termoretraibile da una base di codice closed-source, non è auspicabile in generale e potenzialmente problematica con alcune licenze open-source. Certamente non vuoi farlo con Spring.
In teoria, qualcuno potrebbe scrivere uno strumento per aiutare. In pratica, lo strumento dovrebbe (per esempio) sapere come estrarre le dipendenze dinamiche delle classi dalle configurazioni di Spring espresse in annotazioni, XML e dai descrittori di bean creati in fase di esecuzione da una configurazione di ordine superiore (ad esempio SpringSecurity). Questo è un grande chiedere. E anche in questo caso si ha il problema che una "piccola" modifica ai cablaggi effettuata sulla piattaforma di installazione potrebbe fallire a causa di un JAR richiesto che è stato escluso dal processo di potatura JAR.
A mio avviso, le alternative sono più pratici:
- Se si utilizza Maven/Ivy per gestire le dipendenze, guardare i grafici di dipendenza, striscia fuori dipendenze che sembrano essere non più necessari ... e testare, testare, testare.
- Rimuovere manualmente i JAR che sembrano non essere utilizzati ... e testare, testare, testare.
- Non preoccuparti. Un livello moderato di JAR cruft inutilizzato potrebbe aggiungere un secondo o tre ai tempi di avvio di webapp e di implementazione, ma generalmente ciò non ha importanza. (Ma se lo fa ... vedi sopra.)
[Proguard] (http://proguard.sourceforge.net) è un altro esempio che può farlo (e altro). – BalusC
@BalusC - e ci sono indubbiamente altri esempi degni. Ma sfortunatamente, non affrontano veramente * questo * problema. –
Mi riferivo al 1 ° paragrafo :) Prima di modificare le alternative pratiche in, che comunque sono pienamente d'accordo (+1). – BalusC
Ecco perché alcuni progetti Java precedenti hanno 600 Jars e un file di guerra da 200 MB, per un'applicazione di 10.000 linee. Una specie di dolore se non lo gestisci con attenzione ...
Si dovrebbe davvero chiedere al fornitore di framework o leggere la documentazione. Analizzare in modo statico quali vasi sono necessari potrebbe non essere sufficiente in alcuni casi (caricamento dinamico) e talvolta potresti finire con troppi barattoli.
Una volta ho fatto qualche cosa di ftp helper in una sorta di libreria "di utilità". Dipende da un barattolo di App ftp. Se non hai mai usato le funzionalità ftp nella libreria non avresti bisogno del contenitore ftp, ma l'analisi statica del codice potrebbe dire che ne hai bisogno. Questo è qualcosa che dovresti documenti.
- 1. Quali gruppi sono necessari per MVC4?
- 2. Java finalizzatori, quali compiti sono realmente necessari
- 3. Interfaccia utente jQuery: quali file sono necessari?
- 4. File minimi necessari per distribuire lato server webAPI
- 5. Quali sono i plugin necessari in VIM per Latex?
- 6. Quali sono gli operatori pdf necessari per eseguire una funzione di ricerca in un PDF in iphone sdk?
- 7. Quali sono i modi per modificare una funzione in R?
- 8. - Sono necessari nome e ID?
- 9. Determinazione dei valori minimi in un vettore in R
- 10. Quali sono i diversi tipi di documenti necessari per lo sviluppo del software?
- 11. Perché sono necessari ForwardIterators per modellare DefaultConstructible?
- 12. R: sono necessari i valori "ylim" finiti nella funzione
- 13. Trova i valori minimi e massimi di una funzione
- 14. Quali sono i parametri per la funzione punteggio di sklearn?
- 15. Firma del metodo per Jacobian di una funzione di minimi quadrati in scipy
- 16. Determinazione del tipo di una funzione in Programmazione funzionale
- 17. Perché i bordi sono necessari in una connessione Relay/GraphQL?
- 18. Quali registri sono sicuri da utilizzare in una funzione (x86)
- 19. Uno strumento per dirti quali sono i file sorgente necessari in un progetto C++?
- 20. Numeri minimi di minimizzazione dei quadrati minimi
- 21. Perché sono necessari più caricatori di classe?
- 22. Determinazione dell'origine di una discussione
- 23. Quali autorizzazioni/diritti sono necessari per eseguire regsvr32/s/c "myocx.ocx"
- 24. Cosa è successo con Titanium Desktop? Quali pacchetti sono necessari per iniziare?
- 25. Quali passaggi sono necessari per abilitare l'antialias quando si utilizza QPainter su un QGLWidget?
- 26. Java - Sono necessari gli attori Play2 per l'implementazione di WebSockets?
- 27. Quali sono i vantaggi di definire e chiamare una funzione all'interno di un'altra funzione in R?
- 28. Problema di distribuzione di SQL Server CE 4.0: quali file sono necessari?
- 29. Determinazione di quali sono le aree di testo e grafica in un'immagine
- 30. Quali sono tutti i codici funzione per i comandi svn?
Test, test, test. Ma di solito se il framework dice che ha bisogno di tutti i barattoli, è meglio fornire tutti i barattoli, altrimenti si è da soli. –
Un esempio è Spring. Quasi tutte le dipendenze di terze parti sono contrassegnate come opzionali nel MAVen POM. Sono d'accordo sul fatto che il test sia il "catch-all" per questo, ma è una buona domanda - ho spesso desiderato un modo per sapere a runtime quali librerie sono effettivamente utilizzate. Ho usato un compilatore nativo Ahead-of-Time Java - questo ha registrato tutte le classi utilizzate e i vasi da cui provenivano. È possibile emulare qualcosa di simile con un programma di caricamento classi personalizzato che tiene traccia delle classi caricate e utilizza Class.getResource() per determinare la posizione. – mdma