Da Java a .NET: andata e... ritorno?

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