Archiwum kategorii: Java

Netbeans nie aktualizuje aplikacji www

Pracując przy aplikacji webowej (napisanej w Javie) natknęłam się na problem nieaktualizowania aplikacji przez Netbeans. Proces kompilacji udawał się, jednak na serwerze nadal była stara zawartość. Z jakiegoś powodu nie udało się zaktualizować kodu.

Rozwiązaniem było ręczne usunięcie folderu web/web-inf/classes. Po usunięciu katalogu i przebudowaniu projektu Netbeans aktualizował zawartość plików.

Limity pamięci maszyny wirtualnej Javy w IntelliJ

Aby ustawić limity pamięci maszyny wirtualnej Javy dla środowiska IntelliJ, należy zmodyfikować wartości w pliku idea.exe.vmoptions.

Przykładowa ścieżka do niego: C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.3\bin\idea.exe.vmoptions.

Przykładowe ustawienia pamięci:
-Xms128m
-Xmx1000m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=150m

Jeżeli przesadzi się z wartościami, IntelliJ nie uruchamia się, nie podając żadnego komunikatu.

Przekazywanie parametrów do funkcji – Java kontra C#

Parametry przekazywane do funkcji w Javie są przez wartość, co oznacza że wewnątrz funkcji operujemy na kopii obiektu. I kropka. W przypadku typów prostych faktycznie nie ma problemu:

int mainInt = 60;
System.out.println("mainInt before changes: " + mainInt);
m.changePrimitive(mainInt);
System.out.println("mainInt after changes: " + mainInt);
public void changePrimitive(int localInt){
localInt = 3;
System.out.println("localInt in function: " + localInt);
}

mainInt before changes: 60
localInt in function: 3
mainInt after changes: 60

W przypadku typów obiektowych (referencyjnych) również kopiowany jest obiekt, lecz w praktyce wygląda to nieco inaczej niż w przypadku typów prostych. Czytaj dalej

Java: return w try-catch-finally

Jedno z typowych zadań pojawiających się od czasu do czasu na rozmowach (lub egzaminach:)) polega na stwierdzeniu, który blok zostanie wykonany jako ostatni i jaka wartość zostanie zwrócona.

W poniższym przykładzie kolejność wypisywanych tekstów jest zgodna z numerami:

try {
  System.out.println("Try");//1
  throw new Exception();
} catch (Exception ex) {
  System.out.println("Catch");//2
} finally {
  System.out.println("Finally");//3
}
System.out.println("Function");//4

Zatem wynik to po prostu:
Try
Catch
Finally
Function

Jak natomiast zachowa się funkcja zawierająca return w każdym z bloków (try/catch/finally/ciele funkcji)? Czytaj dalej

Pola final w Javie

Pola oznaczone jako final zachowują się prawie jak stałe w języku C. Prawie, gdyż owa stałość w sensie stricte dotyczy właściwie tylko typów prostych – nie można zmieniać ich wartości. Inaczej ma się sprawa z typami złożonymi – nie można zmieniać wskaźnika do wskazywanego obiektu, natomiast na obiekcie można dokonywać wszelkich dostarczanych przez niego operacji, czyli zmieniać jego stan – dodawać elementy do listy, zmieniać wartość napisu itd. Jak w poniższym przykładzie:

public class Doge {
  public final int primitivie = 3;
  public final ArrayList objectivie = new ArrayList();
  //public final ArrayList objectivieNull; //Error: variable might not have been initialized
  public final String stringie = "Wow! Wow!";
}

Doge doge = new Doge();
//doge.primitivie = 4; //Error: cannot assign a value to final variable
//doge.objectivie = new ArrayList();//Error: cannot assign a value to final variable
doge.objectivie.add(3);//OK!
doge.stringie.toLowerCase();//OK!

How to debug remote application on Tomcat

Some time ago I wrote about a situation when starting of Tomcat from Netbeans failed. Of course when someone follows with steps prepared in this article, debugging is more complicated. But there is one nice feature in Tomcat – we can debug remote servers.

First thing to do is to enable debugging applications deployed on Tomcat, start Tomcat by this way:

Tomcat/bin/catalina.bat jpda start

By default, Tomcat is listening on port 8000 (changing default port is possible in some configuration files).

In second step we should connect from Netbeans to our application. Sources in IDE (in my case: Netbeans) must be identical with classes deployed on Tomcat! If there are any differences, some breakpoints will be unavailable and debugging will not working properly.

Go to Debug menu and fill forms:

Debugger: Java Debugger (JPDA)
Connector: SocketAttach
Host: 127.0.0.1
Port: 8000

and click OK. After a while, breakpoints should be available. Look into console. There are info about enabling each breakpoint.

Podpisywanie plików .jar certyfikatem PFX

Podpisywanie plików .jar (lub dowolnych innych formatów aplikacji) jest możliwe za pomocą certyfikatów z opcją „podpisywanie kodu”.

Sama procedura podpisywania może zostać przeprowadzona przez środowisko (po skonfigurowaniu), możliwe jest też podpisywanie ręczne, z linii komend. Najprościej zrobić to w następujący sposób:

  1. Instalacja certyfikatu w systemie (dwuklik, dalej wg kreatora – uwaga, warto zaznaczyć klucz jako eksportowalny).
  2. Pobranie aliasu:
    keytool -list -storetype PKCS12 -keystore certyfikat.pfx -v > alias.txt
  3. Podpisywanie – najlepiej dodać do zmiennej systemowej PATH ścieżkę do Javy, np. C:\Program Files\Java\jre\bin. Znajduje się tam program jarsigner, którym będziemy podpisywać.
    jarsigner.exe -storetype PKCS12 -tsa http://tsa.starfieldtech.com -keystore certyfikat.pfx aplet.jar "alias który mamy w pliku alias.txt - alias należy podać w cudzysłowie"
  4. Weryfikacja podpisu:
    jarsigner.exe -verify -verbose -certs aplet.jar > weryfikacja.txt
  5. Jeżeli w pliku weryfikacja.txt pojawią się dane o naszym certyfikacie, oznacza to, że plik został prawidłowo podpisany.

Starting of Tomcat failed

Some day I had problem with deploying project from Netbeans to Tomcat (you may look to similar discussion on StackOverflow: Starting of Tomcat failed from Netbeans 7.3). Unfortunatelly, any of suggestion didn’t help, so I wrote my own deployer in Windows batch.

Some code:


ECHO AutoDeploy to Tomcat

SET tomcat_path=C:\TOMCAT
SET build_path=D:\SVN\SMOK_ELTE\JAVA\amfgw\build\web\WEB-INF\classes

::Stop Tomcat
echo Stop Tomcat, press any key to continue...
pause

netstat -a -n | findstr :8080 > NUL
if %errorlevel%==0 ( goto :stoptomcat ) else ( goto :next )
:stoptomcat
echo Closing Tomcat.
call %tomcat_path%\bin\shutdown.bat
goto :next
:next

::Copy compiled classes from Netbeans to Tomcat
XCOPY %build_path% "%tomcat_path%\webapps\ROOT\WEB-INF\classes" /E /C /R /I /K /Y

::Run Tomcat
CALL %tomcat_path%\bin\catalina.bat jpda start

But I wanted more – let Netbeans run this script after building my application.

Edit build.xml file, located in project directory, by putting these lines:
<target name="-post-compile">
<exec dir="." executable="cmd">
<arg line="/c D:\scriptLocation\deployOnTomcat.bat"/>
</exec>
</target>

Ścieżka pliku w Javie

Dostępna w Javie klasa File daje kilka możliwości uzyskania ścieżki wyznaczonego pliku. Czym różnią się poszczególne metody? Oto porównanie – dla systemu Windows.

File file = new File("C:\\Users\\XYZ\\proj.png");
try {
  System.out.println("file.getAbsolutePath() = "+file.getAbsolutePath());
  System.out.println("file.getCanonicalPath() = "+file.getCanonicalPath());
  System.out.println("file.getName() = "+file.getName());
  System.out.println("file.getParent() = "+file.getParent());
  System.out.println("file.getPath() = "+file.getPath());
  System.out.println("file.toString() = "+file.toString());
  System.out.println("file.toPath().getFileName() = "+file.toPath().getFileName());
  System.out.println("file.toPath().getFileSystem() = "+file.toPath().getFileSystem());
  System.out.println("file.toPath().getName(0) = "+file.toPath().getName(0));
}
catch (IOException e)
{
  e.printStackTrace();
}  

A oto wynik, jaki zwracają powyższe polecenia:
file.getAbsolutePath() = C:\Users\XYZ\proj.png
file.getCanonicalPath() = C:\Users\XYZ\proj.png
file.getName() = proj.png
file.getParent() = C:\Users\XYZ
file.getPath() = C:\Users\XYZ\proj.png
file.toString() = C:\Users\XYZ\proj.png
file.toPath().getFileName() = proj.png
file.toPath().getFileSystem() = sun.nio.fs.WindowsFileSystem@7471c619
file.toPath().getName(0) = Users

Eclipse – automatyczne zamykanie nawiasów

Strasznie irytuje mnie automatyczne zamykanie nawiasów klamrowych {} w edytorze Eclipse. Na szczęście można je wyłączyć.

eclipse

W tym celu wystarczy przejść w menu:
Preferences -> Java -> Editor -> Content Assist -> Typing -> Automatically close
i odznaczyć checkboxy.

Więcej porad dotyczących tego IDE znajdziemy w oficjalnej dokumentacji: http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftips%2Fjdt_tips.html