Da Java a .NET: andata e... ritorno? Lorenzo Barbieri ObjectWay S.p.A. [email protected] Sponsor 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 internal protected 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.0 già 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 Applet JavaBean AWT Frame WFC Forms JSP/Servlet -> Classi C# -> Windows Forms Controls -> Classi C# -> Windows Forms -> Windows Forms -> 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 ;-) DEMO JLCA 3.0: Conversione di JExcel 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 DEMO J#: Utilizzare JExcel da codice J# 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 DEMO J#: Utilizzare JExcel da C# 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: Utilizzo di JExcel da riga di comando 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... Interoperabilità tra Java e .NET .NET J2EE Presentation Data Integration & Persistence Business Logic WS WS MQ MQ WIRE WIRE Interoperabilità tra Java e .NET Presentation to Presentation XML Web Services Runtime Bridges Integration Brokers Business to Business X Non ce ne Xoccupiamo! X Messaging Shared Databases Presentation to Business X X X X X Business to Data X X X X 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 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 Cos’è JNI • Java Native Interface – Permette a Java di richiamare metodi nativi – Permette a codice nativo di richiamare codice all’interno di una JVM – http://java.sun.com/j2se/1.5.0/docs/guide/jni/ • In entrambi i casi possiamo usare del codice C++ per fare da ponte fra Java e .NET Hosting di controlli .NET • E’ possibile inserire controlli .NET in appliacazioni Java utilizzando JNI e l’interoperabilità COM/.NET – Bisogna passare da C++ – Non è una tecnica semplice da usare • Trovate un esempio qui: – http://www.devx.com/interop/Article/19845/0/page/1 Libri • Application Interoperability: Microsoft .NET and J2EE • Lo trovate in libreria o su: http://www.microsoft.com/downloads/details.aspx?FamilyId=5FBA8 E7A-B896-4E5F-B3C0-FCF7FF1B9D29&displaylang=en Libri • Microsoft .NET and J2EE Interoperability Toolkit di Simon Guest Links http://www.ugidotnet.org http://forum.ugidotnet.org http://mobile.ugidotnet.org