Java Tools

IDE

Eclipse

So kann man an ein jar das Javadoc anhängen: Das Projekte anklicken, Menü, Project, Properties, Libraries, [jar], aufklappen, javadoc location.

So kann man ein jar für das Projekt erzeugen

Export, Java, JAR file

Shortcuts

downcase:

STRG SHIFT y

UPCASE:

STRG SHIFT x

Breakpoints

Breakpoints können nur den aktuellen Thread anhalten, oder gleich die ganze VM. Den Default kann man so festlegen

Preferences -> Java -> Debug -> [ Suspend Execution | Suspend Thread ]

In der Debug View kann man mit dem J! Symbol Brakepoints setzen, die nur bei Exceptions aktiv werden

Eclipse Java Exception Brakepoint

Code formatieren

Preferences -> Java -> Code -> Style -> Formater

Dort New anklicken und ein eigenes anlegen.

Mit CTR SHIFT F

anwenden lassen

Prevent Eclipse from auto formatting areas, set Java -> Codestyle formatter -> Edit -> Enable Off / On tags

/*
 * @formatter:on
 *
 * Format
 *   as you
 *     wish!
 *
 * @formatter:off
 */

Eclipse stürzt ab

Das Eclipse Error Log liegt im Workspace Ordner und endet auf .log.

Eclipse 3.1.1 und PermGen zu klein? In der eclipse.ini das hier mal mit mehr Speicher probieren

--launcher.XXMaxPermSize 256m

Wenn Eclipse in Dialogen abstürzt, in denen man durch das lokale Dateisystem navigiert (File open...) hilft seltsamerweise der eclipse.exe explizit den Pfad zur Java Installation mitzugeben.

C:Programmeeclipseeclipse.exe -vm C:ProgrammeJavajdk1.6.0_24binjava.exe

Quellen mit einem JAR verknüpfen

Java Eclipse jar Quellcode verknüpfen

Eclipse @author

Eigentlich setzt Eclipse z.B. bei generierten Kommentare für neue Klassen automatisch eine @author Annoation. Allerdings ermittelt Eclipse dann je nach Systemkonfiguration nicht den richtigen Namen. So kann man das in der eclipse.ini reparieren

-Duser.name=John Doe (JD)

Java imports automatisch von Eclipse verwalten lassen

Wenn z.B. in einer Klasse Code benutzt, der einen Import erforderlich gemacht hat, und entfernt diesen Code in Eclipse, kann Eclipse den überflüssigen Import automatisch entfernen

Preferences - Java - Editor - Save Actions - Organize imports

Eclipse Plugins

Eclipse UML Plugins

The ObjectAid UML Explorer for Eclipse

UML of Java class

eUML2

Netbeans

build Ordner

Man kann in Netbeans kein vorhandenes Projekt importieren, wenn man es dort bereits einen build Ordner gibt.

Fehlermeldung:

Cannot place the project in a Project Folder that already contains "build" folder.

Workarround:

  • Den vorhanden Ordner build Ordner temporär umbennen
  • Das Projekt normal importieren
  • CTRL 2 drücken, Projekt aufklappen, nbproject, project.properties, build.dir, diesen Wert abändern
  • Temporär umbennaten buidl Ordner wieder build nennen
  • Fertig

JDK

So kann man das JDK in Netbean umstellen: Rechtsklick auf das Projekt, Libraries (!), Java Platform. Falls das JDK noch nicht eingerichtet wurde: Manage Platforms (es können nur JDK ausgewählt werden, keine JRE).

Falls das Source Level sich auch ändert (z.B. von 1.4 auf 1.6) geht das so: Rechtsklick auf das Projekt, Sources, Source / Binary Format.

Build

ANT

Das Apache ANT Werkzeug. Vergleichbar mit Makefiles, Schwerpunkt liegt aber nicht auf Abhängigkeiten (das kann Java selbst) sondern auf der Bereitstellung plattformunabhängiger Befehle (z.B. zum Kopieren von Dateien).

Links

Kleines ANT Beispielprojekt

<project name="MyProject" default="compile" basedir=".">

  <!-- set global properties for this build -->
  <property name="src"         location="src"   />
  <property name="build"       location="build" />
  <property name="dist"        location="dist"  />
  <property name="mainclass"   value="de.tgunkel.Test.Foo" />
  <property name="distjarname" value="MyProject" />

  <!-- path for compiling the code -->
  <path id="compilepath">
    <fileset file="../../src/lib/foo_1.5.0.jar" />
    <fileset dir="../../src/lib/">
      <include name="**/*.jar"/>
    </fileset>
  </path>

  <!-- path for running the code -->
  <path id="runpath">
   <path refid="compilepath"/>
   <pathelement location="build"/>
   <pathelement location="etc"/>
   <fileset file="../../lib/otherlib/foo-2.0.0.jar" />
  </path>

  <!-- clean -->
  <target name="clean" description="clean">
    <!-- <delete dir="${build}" /> -->
    <delete includeemptydirs="true">
      <fileset dir="${build}" includes="**/*"/>
    </delete>
  </target>

  <!-- Some initial stuff -->
  <target name="init" description="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <mkdir dir="${build}"/>
    <mkdir dir="${dist}"/>
  </target>

  <!-- compile it -->
  <target name="compile" description="compile the source" depends="init">
    <javac srcdir="${src}" destdir="${build}">
     <classpath refid="runpath">
     </classpath>
    </javac>
  </target>

  <!-- run the compiled code -->
  <target name="run" depends="compile" description="Run the program" >
    <java classname =3D "${mainclass}">
      <arg value="foo"   />
      <arg value="bar"    />
      <arg value="42"  />
      <classpath refid="runpath" />
    </java>
  </target>

  <!-- create a jar -->
  <target name="jar" description="makes a jar" depends="compile">
    <jar basedir="${build}" compress="true" jarfile="${dist}/${distjarname}">
      <manifest>
        <attribute name="Built-By" value="Thorsten Gunkel" />
        <attribute name="Main-Class" value="${mainclass}"  />
        <!-- You need the whole run time path here for an executable jar
         <attribute name="Class-Path" value="../../../src/lib/foo_1.0.0.jar" />
         -->
      </manifest>
    </jar>
  </target>

</project>

Variablen mit Werten aus anderen Dateien füllen

<property file="my-extra-variables.properties"/>
<property name="JAVA_HOME"  value="${YOUR_JAVA_HOME}" />

Warnungen des Compilers wie Fehler behandeln lassen

Wenn man erreichen möchte, dass sich kein Code eingebaut wird, der nur mit Warnungen übersetzt wird, kann man diese nützlich Option setzen:

-Xlint -Werror

Bzw. über ant

 <javac ....>
   ...
   %lt;compilerarg value="-Xlint" />
   %lt;compilerarg value="-Werror" />
 %lt;/javac>

Jede Warnung wird dann wie ein Fehler behandelt und führt zum Abbruch des Compilers. So werden Warnungen sehr früh bemerkt.

Textersetzung

So kann man mit ANT in Dateien Textersetzung durchführen

<project basedir=".">
 <target name="build" description="Replace some strings">

  <replace dir=".">
   <include name="myfiles/**" />
   <replacefilter token="__FOO__" value="BAR" />
   <replacefilter token="__43__" value="42" />
  </replace>

 </target>
</project>
 

Java Debug

<jvmarg value="-Xdebug"  />
<jvmarg value="-Xnoagent"  />
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y" />

Classpath setzen

So kann man den Class-Path in einem Manifest setzen

<!-- This is the manifest file we will use -->
<property name="manifest_file" value="$../manifest.mf" />

 <!-- This path will be added to the manifest file as the class path-->
<path id="manifestpath_as_path">
  <fileset dir="../lib">
    <include name="**/*.jar"/>
  </fileset>
</path>

 <!-- This converts the manifestpath into a format that manifest task will accept. The jarfile attribute is require, but only the path of the file is relevant -->
<manifestclasspath property="manifestpath_as_list" jarfile="../lib/FIXME.jar">
  <classpath refid="manifestpath_as_path" />
</manifestclasspath>

<!-- This creates the manifest file -->
<target name="CreateManifest">
  <manifest file="${manifest_file}">
    <attribute name="Class-Path" value="${manifestpath_as_list}" />
  </manifest>
</target>

Maven

Maven

one-jar

Mit one-jar kann man mehrere jars in ein großes jar packen und über one-jar selbststartend machen.

Decompiler

JAD

Mit dem JAD Java Decompiler aus class-Dateien wieder lesbaren Quellcode machen. Mit dem Eclipse Plugin JADClipse sogar vollautomatisch öffnen der entsprechenden Klassen. Wenn man eine Eclipse Version neuer als Indigo einsetzt, muss man manuell in den Eclipse Einstellungen unter

General - Editors - File Associations

diese Dateiendung

.class without source

auch mit Jadclispe verbinden. Siehe auch Configuring eclipse to use jad.

OutOfMemoryError: Java heap space

See also java.lang.OutOfMemoryError: GC overhead limit exceeded

Als erstes den Heap Speicher hochsetzen

-Xmx512m

Falls das nicht hilft, aktuellen heap Speicherverbrauch des Programms mit der genannten PID ausgeben

jmap -histo PID

Write memory consumption into a file

jmap -dump:file=/tmp/java_pid29731.hprof 29731

Oder aber abwarten bis es nicht mehr gereicht hat und dann erst auswerten

# java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/ -jar foo.jar
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid29731.hprof ...
Heap dump file created [1271286324 bytes in 143.266 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
...

And see the contents (but jhat is really slow for bigger hprof files and needs a lot of memory)

jhat -J-Xmx512m java_pid29731.hprof
...
Started HTTP server on port 7000

Better is jvisualvm, just start it, Load, switch to hprof files, open it

Eclipse Memory Analyzer Plugin (MAT) And do Eclipse File Open to open the hprof file created during an out of memory

Wie oft läuft full garbage collection an?

jstat -gc 1

Code quality

CodePro Analytix

CodePro Analytix Can find copy that was copied arround

Sonar lint

https://marketplace.eclipse.org/content/sonarlint

Metrics

Metrics Berechnet für den Code verschiedene Metriken und zeigt wo im Code entsprechende Richtwerte überschritten werden.

Performancemessungen / Profiler

YourKit

https://www.yourkit.com

JRat

JRat

So startet man das zu messende Programm

java -javaagent:shiftone-jrat.jar ...

So kann man sich die Ergebnisse mit dem mitgelieferten Viewer ansehen

java -Xmx256M -jar shiftone-jrat.jar

JRat hatte allerdings Probleme mit Hibernate und Annotations.

JIP

JIP

So startet man das zu messende Programm

java -javaagent:[DIR]profile.jar ...

Am einfachsten ist es, wenn [DIR] ein absoluter Pfad ist.

Andere Variante

java -javaagent:[DIR]profile.jar -Dprofile.properties=[DIR2]profile.properties

Auch hier ist es einfacher, wenn [DIR] und [DIR2] absolute Pfade sind.

Im Paket ist ein Beispiel für eine profile.properties enthalten. Damit man sich die Ergebnisse visualisieren lassen kann, muss man in der properties mindestens

output=both
setzen. Wenn man in der properties den Eintrag file auf einen Ordner zeigen lässt, dann wird jeder neue Lauf in eine neue Datei geschrieben.
 

Ebenfalls nützlich ist der Eintrag

output-method-signatures=yes

So kann man sich die Ergebnisse schließlich visualisieren lassen

java -jar jipViewer.jar [DIR3]/profile.xml

Wobei hier [DIR3] der Ordner ist, in den JIP die Messwerte Schreiben sollte.

jvisualvm

Detailed graphs about what Java programs on your computer are currently consuming

http://www.jvmmonitor.org

Plugin for Eclipse to get a first idea what your program is consuming