Sun Certified Java Developer

Today I received a following email:

“Hi Andrzej,
Congratulations! You have passed the Oracle Certified Master, Java SE6 Developer certification. You are among the elite 1% of certified Java professionals who have gone on to achieve the Oracle Certified Master, Java SE6 Developer certification.”

In comparison to the previous exams I took at Sun/Oracle, below was a bit of a change:

You have received a passing score. Passing grades do not receive a score, just the pass.

So card telling me how much luck I had in passing (except for “enough”).

The exam itself was surprisingly lot of fun to do, however without support from Oracle I would fail at problems caused by transition from Prometric to Pearson.

jTDS SQL driver in Glassfish

jtds in glassfish v3

cd /opt/servers/glassfish-3.1.1/glassfish/domains/domain1/lib
ln -s /opt/tools/maven-repo/net/sourceforge/jtds/jtds/1.2.5/jtds-1.2.5.jar

let’s setup the connection pool in the admin console. Ping works, seems to work?

[#|2011-10-01T20:27:09.078+0200|SEVERE|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=17;_ThreadName=Thread-3;|WebModule[/RTSuiteWeb]StandardWrapper.Throwable
java.lang.AbstractMethodError
	at com.sun.gjc.spi.jdbc40.ConnectionHolder40.init(ConnectionHolder40.java:96)
	at com.sun.gjc.spi.jdbc40.ConnectionHolder40.<init>(ConnectionHolder40.java:87)
	at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.<init>(ConnectionWrapper40.java:64)
	at com.sun.gjc.spi.jdbc40.Jdbc40ObjectsFactory.getConnection(Jdbc40ObjectsFactory.java:90)
	at com.sun.gjc.spi.ManagedConnection.getConnection(ManagedConnection.java:462)
	at com.sun.enterprise.resource.allocator.LocalTxConnectorAllocator.fillInResourceObjects(LocalTxConnectorAllocator.java:119)
	at com.sun.enterprise.resource.pool.ConnectionPool.getResource(ConnectionPool.java:488)
	at com.sun.enterprise.resource.pool.PoolManagerImpl.getResourceFromPool(PoolManagerImpl.java:242)
	at com.sun.enterprise.resource.pool.PoolManagerImpl.getResource(PoolManagerImpl.java:167)
	at com.sun.enterprise.connectors.ConnectionManagerImpl.getResource(ConnectionManagerImpl.java:338)
	at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:301)
	at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:236)
	at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:165)
	at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:160)
	at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:113)

Bazinga!

Let’s see some source code:

protected void init() {
    try {
        defaultClientInfo = getClientInfo();
    } catch (SQLException e) {
        _logger.log(Level.INFO, "jdbc.unable_to_get_client_info", e.getMessage());
        if(_logger.isLoggable(Level.FINEST)) {
            _logger.log(Level.FINEST, "jdbc.unable_to_get_client_info", e);
        }
    }
}

com.sun.gjc.spi.jdbc40.ConnectionHolder40.java

    public Properties getClientInfo() throws SQLException {
        checkValidity();
        return con.getClientInfo();
    }

com.sun.gjc.spi.base.ConnectionHolder.java

protected void checkValidity() throws SQLException {
    if (isClosed) throw new SQLException("Connection closed");
    if (!valid) throw new SQLException("Invalid Connection");
    if (active == false) {
        mc.checkIfActive(this);
    }
}

Ok, so it’s the jdbc driver. Glassfish fails with an ConnectionJDBC3 object So.. let’s check the code

net.sourceforge.jtds.jdbcx.proxy.ConnectionProxy.java

public Properties getClientInfo() throws SQLException {
    // TODO Auto-generated method stub
    throw new AbstractMethodError();
}

Ant this indeed throws AbstractMethodError 😐

There is no newer version than 1.2.5. The thing is that jtds used to be compatible with jdk 1.3 and 1.4. JDK 5 brought JDBC 4.0, which brought many new methods in the java.sql.Connection. JTDS doesn’t claim to be implementing these, just wants to be compilable against jdk5/6 – hence AbstractMethodErrors. Some history about this

JDBC 4.0 API is supposed to be backwards compatible, there is no problem with using Java SE 6 with JDBC 3.0 drivers, as long as you do not use the new methods or classes there were introduced in JDBC 4.0 API. That’s the theory at least, since if you want to compile against newer api, you have to include some implementation of new methods.

How exactly does it happen that Glassfish decides a driver is JDBC 3.0 or 4.0 (or 4.1, introduced by JDK 7)? That’s pretty simple:

public void detectJDBC30Connection(Connection con, com.sun.gjc.spi.ManagedConnection mcObject) {

    String dataSourceProperty = mcObject.getManagedConnectionFactory().getJdbc30DataSource();
    if (dataSourceProperty != null) {
        setJdbc30Connection(Boolean.valueOf(dataSourceProperty));
        initJDBC30Connection = true;
    } else {
        try {
            Class paramClasses[] = new Class[]{Class.class};

            Method isWrapperMethod = con.getClass().getMethod("isWrapperFor", paramClasses);
            int modifiers = isWrapperMethod.getModifiers();
            setJdbc30Connection(Modifier.isAbstract(modifiers));
        } catch (NoSuchMethodException e) {
            setJdbc30Connection(true);
        } catch (AbstractMethodError e) {
            setJdbc30Connection(true);
        } catch (Throwable t) {
            setJdbc30Connection(true);
            _logger.log(Level.WARNING, "jdbc.unexpected_exception_on_detecting_jdbc_version", t);
        } finally {
            initJDBC30Connection = true;
        }
    }
}

And by mixture of the above, we have a problem, since jTDS claims to have a method which doesn’t work.
Solutions? There are 3:

  • get a proper JTDS version or something that will be detected as a proper JDBC3 driver. Latest version still using jdk4 was 1.2.2. And it works perfectly.
  • Use a different driver. I don’t have much experience with Microsoft SQL and JDBC yet, but there is a quite new driver from Microsoft itself, probably worth giving a spin.
  • Complex solution: fix JTDS driver.

Continuous deployment on Glassfish

Okay, how do we deploy to glassfish from maven on jenkins? Let’s try org.glassfish.maven.plugin:maven-glassfish-plugin first.

pom.xml

<plugin>
    <groupId>org.glassfish.maven.plugin</groupId>
    <artifactId>maven-glassfish-plugin</artifactId>
    <version>2.1</version>
    <executions>
        <execution>
            <goals>
                <goal>deploy</goal>
            </goals>
        </execution>
    </executions>
</plugin>

~/.m2/settings.xml

<profile>
    <id>glassfish</id>
    <activation>
        <activeByDefault>false</activeByDefault>
        <property>
           <name>glassfish.version</name>
           <value>3.1</value>
        </property>
    </activation>
    <properties>
        <glassfish.home>/opt/servers/glassfish-3.1</glassfish.home>
    </properties>
</profile>

Unfortunately, maven tries to go to http://maven.ocean.net.au/external which is returning 503’s today. After some hoops and loops it still doesn’t work, so let’s try a different approach.

pom.xml, revisited

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven2-plugin</artifactId>
    <version>1.1.1</version>
    <configuration>
        <!-- Do not wait after the container is started -->
        <wait>false</wait>

        <container>
            <containerId>glassfish-3x</containerId>
            <home>/opt/servers/glassfish-3.1</home>
            <output>${project.build.directory}/glassfish/container.log</output>
            <append>false</append>
            <log>${project.build.directory}/glassfish/cargo.log</log>
        </container>

        <configuration>
            <deployable>
                <groupId>com.example</groupId>
                <artifactId>application-web</artifactId>
                <type>war</type>
                <properties>
                    <context>/</context>
                </properties>
            </deployable>
        </configuration>

    </configuration>
</plugin>

It works, deploys, undeploys, but requires setting app server each time. Plus by going against maven plugin shorthand naming, requires an excruciatingly tedious

m3 -DskipTests clean package org.codehaus.cargo:cargo-maven2-plugin:undeploy \
org.codehaus.cargo:cargo-maven2-plugin:stop \
org.codehaus.cargo:cargo-maven2-plugin:start \
org.codehaus.cargo:cargo-maven2-plugin:deploy

to run.

AAAAAAAAA! I feel I’m doing something wrong here, so… is there another way? Yes! 🙂

Actually, since I am using Glassfish and it includes a first-class CLI tool called asadmin (short from Application Server admin, as Glassfish used to be called Sun Application Server), let’s use it.

#!/bin/bash

asadmin="/home/glassfish/glassfish/bin/asadmin" 
$asadmin undeploy dashboard-web-0.1-SNAPSHOT
$asadmin restart-domain domain1
$asadmin deploy $WORKSPACE/application/application-web/target/application-web-0.1-SNAPSHOT.war

Put that as a script somewhere and execute as a post-build step after a successful build in Jenkins et voila, a contiuously deployed dev version.

jdd 2k10

Jdd 2k10
Nowa, lepsza, znowu na terenie UEKu (dawniej Akademii Ekonomicznej). Lokalizacja, poza samą salą wykładową, ze wszech miar wygodne, dobry dojazd, zapewniony parking i dużo miejsca wszędzie. Korytarze przestronne, było gdzie rozmawiać albo przeczekiwać wykład (o czym za chwilę). Nowość: dwudniowa (7 i 8 października), ale za cenę jednej jedynej jedynie słusznej ścieżki. To znaczy, że podczas ‘porywającego’ marketingu pewnej firmy ze stolicy światowego IT alternatywą było stanie na korytarzu. Podobnie z resztą na wykładzie Oracle’a, którego, o dziwo, reprezentował nie-Waldek Kot. Posłuchałem chwilę, nie porywało, a i o samym Coherence już gdzieś było. Poza tym catering dobry i bardzo sprawny, poślizgów prawie brak, dedykowane miejsca do ładowania notebooków (na sali wykładowej i korytarzu), sprawnie działające wifi. Jedyna niespodzianka to przesunięcie agendy na wcześniejszą porę kilka dni przed samą konferencją – zdarza się, szczególnie na tej uczelni 🙂
Co do wykładów, to wybrałem… ach tak, przy jednej ścieżce wybrano za mnie. Co jest o tyle zabawne, że agenda materializowała się w zasadzie tuż przed samą konferencją, a najniższa cena była przy znanych 1 lub 2 speakerach. Chociaż napisali “Linda Rising” i starczyło jako zachęta – Billem B by mnie nie przyciągnęli.
Pierwszy wykład: Bill Burke o REST. Dobrze prowadzony, ale.. kacyk prowadzącego + temat nie wieje świeżością. JAX-RS był nowością jakiś czas temu, a teraz.. dobrze, że nie nowości w jdk5. Na domiar złego wykład poruszył z wierzchu tematykę zamiast mówić o ciekawych use case’ach, przypadkach, problemach. Może przesadzam, może dużo ludzi nie słyszało o reście, może.. nie wiem. Wiem, że ja słyszałem, czytałem, wiem o co chodzi i nie czuję się porwany. Następnie Angelika Langer i aplikacje wielowątkowe. To akurat bardzo udany wykład, dobrze wyjaśniał i spokojnie nadawałby się na 2-3 godzinny talk – tematyka obszerna a problemów multum (a ile radości przy debugowaniu). Niestety, Angelikę ciężko było potem spotkać – może tylko mi i ktoś miał więcej szczęścia. W każdym razie duży +.
Jarosław Błąd. Jego wykłady są jak wielka rzeka: powolne, majestatyczne, trochę wiadomo co przyniosą, czasem też trafi się jakaś perełka. Ogólnie +, szczególnie że dzielił się swoimi doświadczeniami. Ted Neward zgodnie z oczekiwaniami, sprawnie, szybko, z dowcipem i do tego bardzo konkretnie o tym, jak do javy dorobić pewne fragmenty języków funkcyjnych. Ted kodował na żywo, więc każdy mógł zobaczyć, że da się to napisać w 30 minut, pokazał, że ktoś zaimplementował to już w Functional Java i Google Guava.. a potem pochwalił języki, które mają te feature’y wbudowane. Piotrka Walczyszyna przeskoczyłem, widziałem już 2 jego prezentacje w tym roku. Na koniec dnia pierwszego Linda Rising, ‘fearless change’, czyli ‘pattern princess’ o patternach wprowadzania zmian. Mimo, że najmniej techniczna prezentacja z całego dnia, była dla mnie najciekawsza. Gdyby tylko nie ucięto jej chwilę przed końcem.
Po pierwszym dniu zorganizowano też imprezę urodzinową (wszak to 5 edycja) w klubie Pauza. Było dobrze, dopóki nie włączyli za głośnej muzyki i do rozmówców trzeba było krzyczeć. Imprezy konferencyjne mają już to do siebie, że ludzie chcą sobie porozmawiać, a tu, jakkolwiek to brzmi, ktoś przeszkadzał muzyką.
Drugi dzień zaczynał się albo od wykładów, albo warsztatów (Linda o wywieraniu wpływu, które z resztą wybrałem, Ted o Scali i Piotrek o Flexie). Nie wiem, co było na wykładach, bo siedziałem na warsztatach i.. jeszcze nigdy 3h na terenie tej uczelni nie zleciało mi tak szybko. Mimo, że tematyka bardzo miękka i nietechniczna, to wydaje mi się, że się przyda 🙂
Oracle Coherence.. zaraz, Oracle i nie ma Walkda, co jest? Nowy prowadzący to niestety nie ta sama liga, może się wyrobi 🙂
Ostatnim (i jedynym :P) wykładem którego wysłuchałem w pełni był tego dnia Technical Debt, prowadzaony przez Thomasa Sundberga. Gość jest inteligentny, tylko niestety mój odbiór został zakłócony przez kiepski dźwięk.
Było nieźle. Organizacyjnie bardzo sprawnie, bez poślizgów, bez kolejek. Gorzej natomiast z częścią merytoryczną, rozumiem, że sponsor chce mieć wykład, ale kogo na konferencji technicznej w sali wykładowej interesuje, że rekrutuje? Ma standa, może robić cuda (vide Software Mind, który na Studenckim Festiwalu Informatycznym zawsze pokazuje coś, co przyciąga tłumy). Prezentacje na których byłem były dobre, poznałem kilka ciekawych osób, ale.. brakło tego czegoś. Standy sponsorów jakieś takie.. niemrawe, z resztą 3 z nich to outsourcing/agencje rekrutacyjne. Wydawałoby mi się, że ludzie z takiej branży powinni być jacyś bardziej.. ludzko-żywiołowi, do mnie nie trafili.
Summa sumarum jestem zadowolony, jakość rozmów w przestronnym korytarzu uratowała mnie od nudy 🙂

Nowa, lepsza, znowu na terenie UEKu (dawniej Akademii Ekonomicznej). Lokalizacja, poza samą salą wykładową, ze wszech miar wygodne, dobry dojazd, zapewniony parking i dużo miejsca wszędzie. Korytarze przestronne, było gdzie rozmawiać albo przeczekiwać wykład (o czym za chwilę). Nowość: dwudniowa (7 i 8 października), ale za cenę jednej jedynej jedynie słusznej ścieżki. To znaczy, że podczas ‘porywającego’ marketingu pewnej firmy ze stolicy światowego IT alternatywą było stanie na korytarzu. Podobnie z resztą na wykładzie Oracle’a, którego, o dziwo, reprezentował nie-Waldek Kot. Posłuchałem chwilę, nie porywało, a i o samym Coherence już gdzieś było. Poza tym catering dobry i bardzo sprawny, poślizgów prawie brak, dedykowane miejsca do ładowania notebooków (na sali wykładowej i korytarzu), sprawnie działające wifi. Jedyna niespodzianka to przesunięcie agendy na wcześniejszą porę kilka dni przed samą konferencją – zdarza się, szczególnie na tej uczelni 🙂

Co do wykładów, to wybrałem… ach tak, przy jednej ścieżce wybrano za mnie. Co jest o tyle zabawne, że agenda materializowała się w zasadzie tuż przed samą konferencją, a najniższa cena była przy znanych 1 lub 2 speakerach. Chociaż napisali “Linda Rising” i starczyło jako zachęta – Billem B by mnie nie przyciągnęli.

Pierwszy wykład: Bill Burke o REST. Dobrze prowadzony, ale.. kacyk prowadzącego + temat nie wieje świeżością. JAX-RS był nowością jakiś czas temu, a teraz.. dobrze, że nie nowości w jdk5. Na domiar złego wykład poruszył z wierzchu tematykę zamiast mówić o ciekawych use case’ach, przypadkach, problemach. Może przesadzam, może dużo ludzi nie słyszało o reście, może.. nie wiem. Wiem, że ja słyszałem, czytałem, wiem o co chodzi i nie czuję się porwany. Następnie Angelika Langer i aplikacje wielowątkowe. To akurat bardzo udany wykład, dobrze wyjaśniał i spokojnie nadawałby się na 2-3 godzinny talk – tematyka obszerna a problemów multum (a ile radości przy debugowaniu). Niestety, Angelikę ciężko było potem spotkać – może tylko mi i ktoś miał więcej szczęścia. W każdym razie duży +.

Jarosław Błąd. Jego wykłady są jak wielka rzeka: powolne, majestatyczne, trochę wiadomo co przyniosą, czasem też trafi się jakaś perełka. Ogólnie +, szczególnie że dzielił się swoimi doświadczeniami. Ted Neward zgodnie z oczekiwaniami, sprawnie, szybko, z dowcipem i do tego bardzo konkretnie o tym, jak do javy dorobić pewne fragmenty języków funkcyjnych. Ted kodował na żywo, więc każdy mógł zobaczyć, że da się to napisać w 30 minut, pokazał, że ktoś zaimplementował to już w Functional Java i Google Guava.. a potem pochwalił języki, które mają te feature’y wbudowane. Piotrka Walczyszyna przeskoczyłem, widziałem już 2 jego prezentacje w tym roku. Na koniec dnia pierwszego Linda Rising, ‘fearless change’, czyli ‘pattern princess’ o patternach wprowadzania zmian. Mimo, że najmniej techniczna prezentacja z całego dnia, była dla mnie najciekawsza. Gdyby tylko nie ucięto jej chwilę przed końcem.

Po pierwszym dniu zorganizowano też imprezę urodzinową (wszak to 5 edycja) w klubie Pauza. Było dobrze, dopóki nie włączyli za głośnej muzyki i do rozmówców trzeba było krzyczeć. Imprezy konferencyjne mają już to do siebie, że ludzie chcą sobie porozmawiać, a tu, jakkolwiek to brzmi, ktoś przeszkadzał muzyką.

Drugi dzień zaczynał się albo od wykładów, albo warsztatów (Linda o wywieraniu wpływu, które z resztą wybrałem, Ted o Scali i Piotrek o Flexie). Nie wiem, co było na wykładach, bo siedziałem na warsztatach i.. jeszcze nigdy 3h na terenie tej uczelni nie zleciało mi tak szybko. Mimo, że tematyka miękka i nietechniczna, to warsztaty świetne, słuchało się wspaniale i w ogóle 🙂

Po warsztatach wykład o Oracle Coherence.. zaraz, Oracle i nie ma Walkda, co jest? Nowy prowadzący to niestety nie ta sama liga, może się jeszcze wyrobi. Ostatnim (i jedynym :P) wykładem którego wysłuchałem w pełni był tego dnia Technical Debt, prowadzaony przez Thomasa Sundberga. Gość jest inteligentny, tylko niestety mój odbiór został zakłócony przez kiepski dźwięk.

Było nieźle. Organizacyjnie bardzo sprawnie, bez poślizgów, bez kolejek. Gorzej natomiast z częścią merytoryczną, rozumiem, że sponsor chce mieć wykład, ale kogo na konferencji technicznej w sali wykładowej interesuje, że rekrutuje? Ma standa, może robić cuda (vide Software Mind, który na Studenckim Festiwalu Informatycznym zawsze pokazuje coś, co przyciąga tłumy). Prezentacje na których byłem były dobre, poznałem kilka ciekawych osób, ale.. brakło tego czegoś. Standy sponsorów jakieś takie.. niemrawe, z resztą 3 z nich to outsourcing/agencje rekrutacyjne. Wydawałoby mi się, że ludzie z takiej branży powinni być jacyś bardziej.. ludzko-żywiołowi, do mnie nie trafili.

Summa sumarum jestem zadowolony, jakość rozmów w przestronnym korytarzu uratowała mnie od nudy podczas unikanych wykładów 🙂

Idea 9, jdk 1.4, debug i problem

8. grudnia wyszła nowa wersja IntelliJ. Działa świetnie, poza tym, że próby debugowania z jdk 1.4 kończyły się tak:

1
2
3
4
5
6
7
8
9
10
C:devsdkjdk1.4binjava
-Xdebug
-Xrunjdwp:transport=dt_socket,address=127.0.0.1:3519,suspend=y,server=n
-Xmx512M
com.firma.krzkak.DataRunner

FATAL ERROR in native method: No transports initialized
Transport dt_socket failed to initialize, rc = 509.

Process finished with exit code 1

Normalnie kod się uruchamiał, działał, ale debug za razem wzięte ChRL oraz drugi, wspaniały i drugi pod względem liczby ludności kraj, nie chciał ruszyć. W końcu znalazłem walkaround:

1
cp jdk1.4/jre/bin/dt_socket.dll jdk1.4/bin/

I działa, życie jest piękne, a do urlopu 3 dni robocze 🙂

Hello world!

Skończyłem z uczelnią (a.k.a. zostałem magistrem), także końca dobiega moja przygoda jako Campus Ambasador firmy Słoneczko Systemiki (Sun Microsystems), naturalną śmiercią umrze blogs.sun.com/ags. Zdecydowałem się założyć nowy, lepszy blog, na którym mam nadzieję uda mi się napisać coś częściej niż raz na kilka miesięcy 😉

Wczoraj wieczorem byłem zdecydowany na eksperyment pt. Movable Type – przede wszystkim z czystej ciekawości. Wszyscy używają WordPressa, sam miałem z nim trochę do czynienia, a tak myślałem, że przyjdzie mi poznać coś nowego. Ciekawość i skłonność do odkrywania nieznanych rozwiązań wzięły górę na niecałą dobę, dlatego ciąg dalszy bloga będzie na ‘zwykłym’ wordpressie.

Krwinka walcząca, czyli Javarsovia 2k9

Piszę ten post z klawiatury Logitech Wave, którą udało mi się zdobyć (po raz pierwszy wygrałem coś na konferencji:D) podczas konkursu organizaowanego przez firmę Javart.

Wyjazd do stolicy uważam za udany, choć do wszystkich prezentacji miałem tym razem nosa. Wybrałem:
Obliczenia w chmurach – Od kiści po siatce do chmury (mogło być super, było bez rewelacji)
Garbage First – nowy garbage collector w maszynie HotSpot (solidny, dobrze przygotowany wykład)
Klastry i loadbalancer w JBossie
Android z perspektywy programisty Java
Ewolucja Architektury (dobrze się słuchało)

Sama konferencja dobrze przygotowana, uczestnicy przybyli tłumnie, wszyscy dostali koszulki, dużo osób dostało kubki – wielkie brawa dla organizatorów, którzy zadbali, aby wszystko działało i było jak najlepiej. Przyjemnie uczestniczyć w dogranej konferencji z perspektywy uczestnika, trzeba tylko przyjść i słuchać/dyskutować, można nawet coś wygrać.
*wywodzi się z mojej interpretacji loga, na której zamiast Duke’a połączonego z syrenką dopatruję się krwinki 🙂
ps. To był pierwszy znany mi event Javowy od znacznego czasu, podczas którego Jacek Laskowski nie był prelegentem 🙂

Eclipse++

33 projekty, 24 mln linii kodu, 10 nowych narzędzi, czyli nowe wydanie Eclipse’a. Mimo, że nie jest to moje ulubione IDE (IntelliJ do kodowania jest po prostu lepszy), to na bazie Eclipse’a oparto wiele interesujących narzędzi i to one są źródłem mojego zainteresowania.

Najbardziej interesującymi elementami nowego wydania są wg mnie:
narzędzie do budowania DSLi.

framework do tworzenia aplikacji dostępnych dla użytkowników

Oprócz tego standardowe nowości: rozwój BIRTa, edytora Javy,

Co przyniesie NB 6.7

RC2 do pobrania, a więc i finalna wersja NB 6.7 tuż, tuż. Najważniejsze zmiany wg mnie, to:

  • integracja z project Kenai i Bugzillą, wsparcie dla JIRY w drodze (będzie w autoupdacie)
  • import pluginów z poprzedniej wersji NB
  • lepsze wsparcie Mavena (lepsze dodawanie dependencji) i poprawiony edytor POMów z code completion i generatorami dla pluginów, profili, dependencji i exclude’owania dependencji
  • profilowanie projektów jee opartych na Mavenie (wreszcie!)
  • wygenerowane źródła (jaxb etc) widać w widoku Project (wreszcie!) i nie commitują się do VCSów
  • możliwość synchronizowania widoku Project i Files z edytorem, czyli wybrany plik otwiera się w edytorze
  • export informacji z profilera do .csv, html i xml oraz OQL do grzebania w heapdumpach
  • zdalne debugowanie Rubyego
  • support Grails 1.1 + uzupełnianie kodu