550 likes | 645 Vues
Da Java a .NET: andata e... ritorno? . Lorenzo Barbieri ObjectWay S.p.A. lorenzo.barbieri@objectway.it. Sponsor. Me.About().
E N D
Da Java a .NET: andata e... ritorno? Lorenzo Barbieri ObjectWay S.p.A. lorenzo.barbieri@objectway.it
Me.About() • Sono un Senior Trainer/Consultant in ObjectWay SpA, specializzato in architetture Microsoft .NET, Windows, SQL Server, Visual Studio Team System, Virtual PC/Virtual Server • Collaboro con UGIdotNET e Windowserver.it • Ho scritto articoli per ioProgrammo, Dev, Network News. • Ho scritto le guide su www.cramsession.com per vari esami di certificazione Microsoft. • Sono specializzato sul Microsoft Solutions Framework, su cui ho scritto alcuni articoli e mantengo una lista di tutte le risorse disponibili.
Di cosa parleremo in questa sessione? • In questa sessione parleremo di: • Tecnologie e Prodotti appartenenti al Lato Oscuro “Ambasciator pena non porta...”
Di cosa parleremo in questa sessione? • In questa sessione parleremo di: • Architetture Java e .NET • Java, J# e C#??? • Migrazione da Java a .NET • Riutilizzo in .NET di librerie Java • Interoperabilità tra Java e .NET avanzata • NON parleremo di Web Service, WSE, WCF/Indigo, WS-* • Pierre, domani 14:30 - 15:45
Architetture Java e .NET • Non voglio annoiarvi con i soliti paragoni architetturali, o se è nato prima l’uovo o la gallina • Java e .NET hanno architetture molto simili, con una storia molto simile, come mostrato ad esempio da David Chappell qualche anno fa: http://se.math.spbu.ru/Seminars/Chappell/Chappell.ppt
Tecnologie corrispondenti • http://www.c-sharpcorner.com/Code/2003/March/J2EEtoDotNet.asp • Naturalmente il fatto che le tecnologie coprano le stesse aree, non vuol dire che siano “la stessa cosa”...
Java, J# e C# • Java, J# e C# sono tutti linguaggi appartenenti alla famiglia del C • J# è la versione per piattaforma .NET del linguaggio Java • Supporta sia le librerie .NET, sia (in parte) quelle Java (1.1.4 più qualcos’altro...) • Utile perchè permette il porting da J++ • C# e Java hanno una sintassi molto simile
Similitudini tra Java e C# • Sintassi simil-C • Ereditarietà singola • Gestione automatica delle risorse (Garbage Collection) • Stringhe immutabili • Reflection • Serializzazione • anche se i meccanismi sono diversi • Etc...
Differenze tra Java e C# • Classi Nested - In Java ci sono due tipi di classi nested: • Inner classes (non esistono in C#) • Static nested classes (equivalenti alle nested classes di C#) • Access modifiers • In Java protected è equivalente ad internal in C# • C# ha protected e internalprotected in più. • In Java il default è protected (internal in C#), in C# è private
Differenze tra Java e C# • Java non ha il concetto di Struct • In Java le eccezioni vanno dichiarate e trappate esplicitamente (Checked Exceptions) e fanno parte della firma del metodo • Costanti (final in Java, const o readonly a seconda dei casi in C#) • Le sequenze di inizializzazione dei costuttori, finalizzatori, etc... non sono identiche.
Novità di Java 5.0già presenti in C# • Boxing/Unboxing dei tipi value • Enum • Foreach • Attributi (solo come Metadati) • Java 5.0 introduce i Generics che in C# appariranno nella 2.0 • Non hanno la stessa implementazione, quelli di Java sono “retrocompatibili” • Altre: http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html
Per una documentazione esaustiva: • Confronto fra Java 1.4 e C# 1.0 (erano entrambi in Beta quando è stata scritta): • http://www.25hoursaday.com/CsharpVsJava.html • Un altro confronto: • http://www.javacamp.org/javavscsharp/ • Confronto fra Java 5.0 e C#: • http://www.harding.edu/USER/fmccown/WWW/java1_5_csharp_comparison.html
Migrazione da Java a C# • La migrazione può essere fatta manualmente o tramite tool: • Java Language Conversion Assistant 2.0 • Java Language Conversion Assistant 3.0 • Integrato in Visual Studio 2005 attualmente in Beta • Entrambi supportano la conversione per progetti VJ++ o singoli file/cartelle
Esempi di migrazione manuale: • NUnit – la 1.x era basata sulle interfacce, la 2.x è stata completamente riscritta basandosi sugli attributi • NHibernate, NAnt, CruiseControl.NET, NEtc... • La migrazione manuale permette un refactoring/riscrittura per adattarsi meglio all’ambiente .NET
Java Language Conversion Assistant 2.0 • http://msdn.microsoft.com/vstudio/downloads/tools/jlca/
Java Language Conversion Assistant 2.0 • Permette di convertire: • Classi Java -> Classi C# • Applet -> Windows Forms Controls • JavaBean -> Classi C# • AWT Frame -> Windows Forms • WFC Forms -> Windows Forms • JSP/Servlet -> ASP.NET • Supporta il linguaggio Java fino alla 1.1.4 con alcune estensioni (ad esempio le collection di Java 1.2)
Java Language Conversion Assistant 3.0 • E’ attualmente in Beta: http://msdn.microsoft.com/vstudio/downloads/tools/jlca/30Beta/ • Supporta anche: • J2EE e J2SE 1.3 • Compresi EJB, JAAS, JCE, JMS, JNDI, e RMI • Migliorata la conversione della parte grafica, includendo anche la conversione parziale di progetti Swing
JLCA – problemi di conversione • Il codice viene convertito AS IS, ma non è possibile convertire il 100% • Esistono una serie di UPGRADE_WARNING e UPGRADE_ISSUE che vengono marcati nel codice • Alcuni costrutti non vengono convertiti (ad esempio gli Enum “old Java style”...) • Alcuni costrutti vengono convertiti male • Ad esempio i getter/setter -> proprietà, a volte vengono convertiti, a volte no...
JLCA – problemi di conversione • Altri problemi “subdoli”: • Exception Broadening • Due eccezioni Java sono mappate su una sola in .NET -> due catch con la stessa eccezione • Algoritmi interni diversi, attenti ad esempio a codice di questo tipo • String s = new String(“Prova!”); • if (b.hashCode() == 1234567) • o anche: • Class c = Class.forName("java.lang.String");
JLCA – problemi “filosofici” • La conversione verso .NET è un processo “irreversibile” • Ad esempio: • Gli EJB sono convertiti in Enterprise Services (COM+) • RMI è convertito in .NET Remoting • La Serializzazione usata è quella di .NET • La Security Java è diversa dalla Security .NET! • Morale: le applicazioni convertite non potranno più “interoperare” con il mondo Java... Attenzione!!!
JLCA – ne vale la pena??? • Se funziona tutto subito si... (RARO!!!) • Se le modifiche sono poche si... • Se le cose da portare sono statiche si... • Il processo di post conversione può essere lungo e noioso • Non si vuole doverlo rifare ogni volta...
JLCA – un esempio: JExcel • Ho preso una libreria molto usata in ambiente Java: http://www.andykhan.com/jexcelapi/ • Questa libreria permette di leggere, scrivere e modificare fogli Excel senza usare i PIA, COM Interop, o la libreria di Raf che usa ADO.NET ;-)
Risultato... (1/3) • Dopo dieci minuti avevo 800 upgrade warning/issue e 500 errori di compilazione • Dopo venti minuti avevo 450 errori di compilazione • Dome mezz’ora avevo 800 errori di compilazione...
Risultato... (2/3) • Il codice faceva schifo... • Mezze property mezzi get/set • Un problema quando la classe aveva la property e l’interfaccia da implementare il get/set o viceversa... • Enum alla Java da riscrivere completamente nell’implementazione • Refactoring selvaggio da applicare, senza avere unit test che garantissero l’esattezza delle modifiche • Nested Classes da rivedere completamente • Visibilità delle classi e dei metodi da rivedere...
Risultato... (3/3) • E se esce un’altra versione della libreria??? • Il codice non è scritto secondo le Best Practice del codice .NET • Ma... Il tool è molto utile per capire le differenze tra i due linguaggi non in teoria (come i link precedenti) ma nella pratica!!!
Riutilizzo in .NET di librerie Java • Per usare direttamente senza conversioni le librerie Java abbiamo due strade: • J# • IKVM.NET (http://www.ikvm.net/) • In entrambi i casi le librerie non vengono convertite, ma usate “direttamente”
J# • J# supporta il linguaggio Java fino alla 1.1.4 con alcune estensioni relative alle versioni successive. • Due modi per importare librerie: • Se si ha il codice (importando i file .java direttamente nel progetto) • Se si hanno solo i .class, .zip, .jar, etc... • Si può usare il tool JbImp
A cosa mi serve usarlo da J#? • Nessuno usa J# per scrivere il proprio codice... • Ma il codice J# può essere richiamato da codice C#, VB.NET esattamente come qualsiasi Assembly .NET • Richiede qualche attenzione: • Referenziare l’assembly con i tipi J# (VSJLIB) • Verificare la firma dei tipi e usare i tipi corrispondenti
IKVM.NET • E’ un’implementazione della JVM in .NET • Permette di utilizzare codice Java direttamente senza una JVM installata • Permette di convertire file .class, .jar, etc... In DLL .NET • Ha librerie più “complete” di J#, almeno in alcune parti.
DEMO IKVM.NET:Conversione JExcel in DLL .NET e suo utilizzo da C#
Come funziona IKVM.NET • IKVM.NET emula una JVM, permette di leggere bytecode Java, converte bytecode Java in IL • Dispone di un’implementazione delle principali librerie Java in un Assebly .NET • Basata sul progetto GNU ClassPath • Non supporta la parte grafica (non è prioritaria per l’autore) • Ha un supporto iniziale per i Generics di Java
Ok... Questo JExcel ci ha stufato... • Anche in questo caso... • Come per tutti i prodotti della serie JQualcheCosa... • Esiste anche NExcel!!! • http://nexcel.sourceforge.net/ • Per il momento supporta solo la lettura di file Excel...
WS WS MQ MQ WIRE WIRE Interoperabilità tra Java e .NET Presentation Business Logic Data Integration& Persistence J2EE .NET
Interoperabilità tra Java e .NET Non ce ne occupiamo!
Alla base dell’interoperabilità: • Ci sono i dati, o meglio... i tipi di dati! • Esistono tipi di dati differenti tra le due piattaforme • Dataset, ResultSet, etc... • Esistono tipi di dati “simili” ma con comportamento diverso: • In Java Date, Boolean e altri tipi di dato sono tipi reference, in .NET sono tipi value -> non gestiscono i nulll • La compatibilità tra tipi di dati diversi è il problema principale dell’interoperabilità!
Serializzazione • Se le due piattaforme non si parlano... come fanno ad interoperare??? • Binary Serialization • Di default è incompatibile tra le due piattaforme • Si può passare dalla Serializzazione di J# (http://msdn2.microsoft.com/en-us/library/ms177590(en-US,VS.80).aspx) • XML Serialization • Come per i Web Services, anche in questo caso bisogna focalizzarsi su un approccio XSD-First!
Runtime Bridges • Esistono vari tool per l’interoperabilità tra i runtime: • Borland Janeva (http://www.borland.com) • JNBridge Pro SE/EE (http://www.jnbridge.com) • Intrinsyc J-Integra (http://www.intrinsyc.com) • Remoting.Corba (http://remoting-corba.sourceforge.net) • IIOP.NET (http://iiop-net.sourceforge.net)
Runtime Bridges • A seconda del prodotto si hanno funzionalità diverse: • Alcuni supportano solo scenari di invocazione di metodi remoti • Altri supportano scenari più complessi, in contensti transazionali End-To-End • Janeva, IIOP .NET e Remoting.Corba supportano anche l’interoperabilità con server Corba • Alcuni prodotti sono “bidirezionali"
Runtime Bridges • Alcuni articoli: • Janeva: http://www.devx.com/interop/Article/19916/0/page/1 • JNBridge: http://www.devx.com/interop/Article/19945/0/page/1
Messaging • Entrambe le piattaforme dispongono di una soluzione per il Messaging asincrono: • MSMQ per .NET • JMS per Java • E’ una specifica, ogni vendor ha un’implementazione diversa • MQ Series di IBM è quella più diffusa • Altre soluzioni di terze parti (Sonic, Novell, Tibco)
Messaging • Soluzioni per l’interoperabilità: • MSMQ-MQSeries Bridge (presente in Host Integration Server) • MQSeries per .NET (in un SupportPac di IBM)
Shared Database • Entrambi i mondi possono accedere a svariati tipi di DataBase • Si usano le tecniche conosciute e già usate: • ADO.NET • JDBC/JDO/etc...
Integration Brokers • Microsoft BizTalk permette di far comunicare piattaforme diverse, e permette anche di trasformare, adattare e gestire vari aspetti della comunicazione. • Esistono altri prodotti simili. • Tutti questi prodotti possono usare Web Services o protocolli nativi per la comunicazione tra le piattaforme.
...e il Ritorno??? • Parliamo solo di interoperabilità... • chi migrerebbe mai da .NET a Java ;-) • Abbiamo visto che alcune delle tecnologie proposte permettono anche l’interoperabilità inversa • Un’altra possibilità è JNI