Meine Frage an die Java'isten hier: Wie kann ich mal gut mit Java anfangen?
meine anforderungen:
* free as in speech ist mir atm egal
* webprogramierung auch egal (ich kann genug php, und RoR schau ich mir dafür als nächstes an)
* mehr/bessere features wichtiger als stabilität
* sollte zum "server" und "gui-client" proggen taugen (kein 3D :))

was nehm ich da ?
* sun java ? bestimmt!
* 1.5 1.6 oder was?
* eclipse, netbeans, sun java studio ?
* was brauch ich da sonst noch ?
--JanReitz

----

Empfehlungen von ThomasBayen:

* sun java für Deine Anforderungen auf jeden Fall. Alles andere ist zwar politisch korrekter, hilft aber nix, wenn Du auf neueste Features stehst, wie Du sagst. Wie das in ein gentoo reingeht, überlasse ich mal Dir...
* Wichtig ist, ein Java ab 1.4 zu haben, weil sich da die Sprache selber geändert hat. 1.5 und 1.6 ist keine wesentliche Änderung in der Sprache, sondern hauptsächlich Arbeit an den Bibliotheken. Wenn Du neu isnstallierst nimm das neuste, was Du bekommen kannst, also 1.6.
* Eclipse rulez, insbesondere wenn Du kompatibel zu uns LUGern bleiben willst. :-) Durch die Offenheit des Projektes tut sich dort viel interessantes im Plugin-Bereich. Ansonsten sagt man, daß netbeans auch nicht schlecht ist. Eclipse wird im Grunde genommen heruntergeladen nud dann in ein Verzeichnis entpackt. Mehr ist da (Java-üblich) nicht zu installieren.
* Meine Ersten-Schritte-Tutorials waren die von http://java.sun.com/docs/books/tutorial/index.html. Geh die mal durch, dann bekommst du einen guten Überblick.
* Für GUIs gibt es grundsätzlich die Wahl zwischen Swing (von Sun, ohne grosse Probleme lauffähig) und SWT (von IBM, bekanntestes Beispiel ist Eclipse, muss jeweils dazu installiert werden). Meine Empfehlung ist Swing.
* Server ist ein weiter Begriff. Sun nennt die Umgebung für Webserver, Webservices, etc. "JavaEE", wofür Du ein besonderes SDK benötigst und einen Webserver wie z.B. Tomcat. Vielleicht reicht Dir aber auch schon RPC für Deinen Server, das sollte mit dem normalen "JavaSE" gehen.

----

Danke Thomas,

* die "politische Korrektheit" kommt bei suns java ja wohl in kürze auch :D
* hab erst 1.6 jdk UND jre installiert (wobei mein gentoo mir auch angeboten hat das jdk auch als jre zu benutzten.... ka, währe das ne gute idee gewesen ?)
* dann hab ich mir eclipse 3.2.1 geholt, nur hat mein gentoo um das zu kompilieren nen 1.4 blackdown nachinstalliert...
* laufen lass ich das aber im 1.6er 
* kann es sein das swing schon beim jdk dabei ist? weil ich hab kein extra paket gefunden.
* das swt ist laut meiner paketverwaltung eine "GTK based SWT Library", das klingt imho gut da ich xfce benutze (gtk basiert) und es rel. schön fände gleiches look and feel zu erzeugen... kann ich das mit swing auch? (die sachen im tutorial sind auf den ersten blick in WinXP gemacht)
* mit Server meine ich nichts was mit "web" anfängt :), rpc und db backend sollten reichen.
* -- JanReitz

----

Antworten von ThomasBayen:

* Also das "JRE" ist die "Java Runtime Environment", also die Umgebung, die Du zur Laufzeit brauchst. Das ist also das richtige, um Java-Programme auszuführen. Das "JDK" ist das "Java Development Kit", das Du brauchst, um Programme zu entwickeln, d.h. die Sourcen von Bibliotheken etc. sind dabei. Natürlich will man beim Entwickeln immer auch Programme starten, deshalb enthält jedes JDK immer auch ein JRE. Du brauchst also keines mehr dazuzuinstallieren. Auf der anderen Seite ist es kein Problem, mehrere Java-Varianten gleichzeitig installiert zu haben. Man muss halt wissen, mit welcher man sein Programm dann startet. Z.B. in Eclipse kann man so Programme für unterschiedliche JDKs, Sprachversionen, oder VMs gleichzeitig entwickeln.
* Bei Java ist es üblich, daß Programme "self-contained" sind, also alle benötigten Bibliotheken mit enthalten. D.h. das Eclipse-Archiv, das Du von http://www.eclipse.org herunterlädst, kannst Du in ein Verzeichnis entpacken und dann einfach "eclipse" in diesem Verzeichnis starten. Du musst Dir keine Gedanken um Abhängigkeiten und dergleichen machen und kannst deshalb den Paketmanager Deines Betriebssystems übergehen (was ich sonst auch sehr ungern tue). Du brauchst dann nichts zu kompilieren oder so (Aber was sage ich das einem Gentoo-User...).
* Ob Du Bibliotheken wie swt über Deine Paketverwaltung installierst oder in Dein Programmpaket packst, musst Du Dir selber überlegen. Ich bevorzuge letzteres ("self-contained" wg. Versions- und Umgebungsabhängigkeiten).
* Ja, Swing ist Teil der JRE, also immer vorinstalliert. Der ursprüngliche Unterschied in der Philosophie von SWT und Swing ist, daß Swing alle Widgets komplett selber macht (und damit plattformunabhängiger ist) und SWT soweit möglich die Widgets der Plattform benutzt (und damit besser integriert ist). Deshalb gibt es SWT jeweils in einer eigenen Variante für Windows, für GTK, für Motiv, etc... Heutzutage verschwimmen die Unterschiede SWT/Swing. Swing kann über LookAndFeel sehr gut angepasst werden (es gibt also auch ein GTK-L&F). Bei der normalen Einstellung sehen die Programme ohne Änderung unter Windows wie Windows-Programme und unter Linux wie GTK aus). Auch der ursprüngliche Performance-Vorsprung von SWT ist dahingeschmolzen, weil die Swing-Entwickler gut daran gearbeitet haben. IMHO ist das Swing-Objektmodell besser durchdacht (aber ich habe nicht viel SWT-Erfahrung). Meine eigene Meinung ist: Wenn es die Konkurrenz durch SWT nicht gegeben hätte, wäre Swing heute nicht da, wo es ist. Deshalb danke ich SWT, aber benutze Swing. ;-)
* für RPC schaust Du Dir am besten mal RMI an. Das ist im JavaSE JDK enthalten und dürfte normale Anwendungsfälle abdecken.

----
JanReitz (erste und dritte einrückungsstufe):

* Beim zweiten hinschaun seh ich das ich nur den JDK installiert hab... hab ich wohl mit dem virtuellen paket vom jre verwechselt
* Steht das JRE vom JDK dem standalone JRE in irgendwas nach? läuft z.b. Eclipse (selbst) genauso flott im JRE vom JDK ? weil da würd ich die paar MB lieber investieren.... aber wenns keinen Sinn macht lass ichs
** Nein, das macht keinen Sinn. Das JDK ist eine Obermenge des JRE --PeterHormanns
*** Bestens.
* oki dann swing...
* ''Bei Java ist es üblich, daß Programme "self-contained" sind'' das find ich aber n bichen merkwürdig, was ich bei .net schön fand das die Programme quasi von null Programm == null "byte" anfingen. Das man seinem Programm eigene Libs beilegt macht sinn, aber auch externe? naja, soweit ich das gesehn hab ist ja java sogar "in sich" nicht rückwärts kompatibel...
** Das ist Ansichtssache. In Java gehen sowohl externe als auch interne Libraries. Allerdings bist Du nur bei internen sicher, daß auch wirklich alle Libs da sind, die Du brauchst und auch alle die richtige Versionsnummer (mit denselben Bugs, die Du beim entwickeln hattest) haben. Der Nachteil ist ein bisschen mehr Speicherbedarf des Paketes (Who cares...?). Das gilt natürlich nicht für die Java-Standardbibliothek! Ich glaube, daß viele der Nervenschäden des durchschnittlichen Windows-Benutzers aus Chaos mit unterschiedlichen DLL-Versionen entstehen (zumindest habe ich schon einige Fälle selbst erlebt). Sowas kann eigentlich nicht gutgehen. Man sieht, wieviel Aufwand z.B. beim Debian Paketmanagement getrieben wird, um alles synchron zu halten. Und trotzdem konnte letztes Jahr auf einmal im "testing" Openoffice für vier Wochen keine Dokumente mehr speichern, weil irgendeine Lib ein bisschen geändert wurde. Deshalb bin ich für "self-contained". -- ThomasBayen
*** oops, und wenn mal wo n bug drin war der die sicherheit deines systems gefährdet dann muss ich alles repacken, obwohl alle klassen und funktionsweisen gleichblieben. Versionisieren würde doch auch Sinn machen (ich hab einfach mal was aus meinem /usr/lib gefischt, weis nichtmal wofür die libXaw da ist...)
***: libXaw.so -> libXaw7.so
***: libXaw.so.6 -> libXaw6.so.6
***: libXaw.so.7 -> libXaw7.so.7
***: wenn ich also mein projekt auf "benutze libXaw.so" stelle bekomme ich höchstwarscheinlich immer die aktuellste, brauche ich eine spezielle dann geb ich die spezielle "libXaw.so.6" an. Aber du sagst ja nur was gang und gebe ist, ausserdem bin ich alles andere als ein erfahrener Programmier deswegen höhr ich jetzt mal auf hier rumzunörgeln. :D -- JanReitz
**** Wie gesagt: Es geht beides. Bei sicherheitskritischen Libs kann also auch extern angesagt sein. Dann ist Dein Code natürlich nicht mehr so plattformunabhängig wie vorher - aber auch das kann man als Feature verstehen, weil sich das Verhalten so der Plattform und den darauf installierten Libs anpasst. Und da es also für beides Argumente gibt, sollte man das von Fall zu Fall entscheiden. :-)
* das RMI kuck ich mal an, muss mir nur erst noch die unterschiede von .net zu java ankucken, die beiden sehn ja aufn ersten blick recht ähnlich aus, nur haben überall mehr oder minder kleine unterschiede. (keine strings in switches, keine 2 switches auf enums ineinander)
** Was willst Du denn für Server schreiben? Etwas eigenes für Spiele? Und einen eigenen Client? Dann ist RMI sicher Ok. --PeterHormanns
*** Für Anlagenautomatisierung, die Clients zum bedienen. Den ganzen Stuff hab ich schon in .Net (Clients mit Gtk#) geproggt, und an meinem bisher grössten Werk möcht ich rausfinden wie das selbe in Java geht.
****Dann fällt RMI wieder raus: RMI geht nur, wenn Client und Server in Java geschrieben sind, denn es werden serialisierte Java-Objekte übers Netz übertragen. Die Brücke zwischen .Net und Java ist SOAP. Die Interoperabilität soll gut sein, aber mit .Net habe ich es persönlich noch nie probiert. AFAIK ist im Java6 eine SOAP-Implementierung enthalten. Lies dazu z.B. in [Java ist auch eine Insel|http://www.galileocomputing.de/openbook/javainsel6/javainsel_18_008.htm] ab Kapitel 18.8. Eine freie SOAP-Implementierung ist Axis bei [Webservices@apache.org|http://ws.apache.org]. Damit habe ich (teilweise auch zusammen mit Thomas, teilweise auf der Arbeit als Prototyp für Steel24x7) schon herumgebastelt. SOAP steht übrigens für __Simple Object Access Protocol__, es ist aber weder einfach noch objektorientiert... --PeterHormanns
***** Ich wollte den Client auch umsetzen, deswegen auch meine Frage nach ner guten Grafikbibliothek.
* ist java.lang.Boolean == boolean ?
** Nein! Boolean, Integer, String, Long etc. sind __richtige__ Objekte, also von __java.lang.Object__ abgeleitet. Sie dienen als Wrapper für eine Zahl oder einen boolschen Wert, wenn man ein Objekt braucht, z.B. als Schlüssel oder Wert in einer Hashtable. boolean, int und long sind primitive Typen, die in Java keine Objekte sind. Dafür kann man die in Expressions verwenden (mit "+" addieren, mit "<" vergleichen etc). Seit Java5 relativiert sich das etwas: Der Compiler wandelt dann einen primitiven Typ automatisch in ein Wrapper-Objekt um und umgekehrt, wenn erforderlich (__Autoboxing__ heißt das glaube ich). Das lästige "Casten" entfällt damit. Aber es schadet nicht, wenn man den Unterschied verstanden hat ;-) --PeterHormanns
*** schön, dann ists jetzt wohl so wie in .net, da boxen/unboxen sich die Primitiven auch je nach dem was grad gebraucht wird. Gut das ich Java >=5 benutz :D
* ham wir eigentlich irgendwo n forum ? :D
** Nein, dafür haben wir ein Wiki! (und eine Mailingliste) --PeterHormanns
*** da wir ja zivilisiert sind... da verpfuscht keine die Posts der anderen. Vieleicht sollten wir die Diskussion in eine extra Seite auslagern.... Erledigt!

[{Tag Diskussion Java}]