:material-language-java:{ .anim-fade } Java
Most of these notes are from the book Java Projects by Peter Verhas.
Maven build lifecycle targets
validate - validate the project is correct and all necessary information is availablecompile - compile the source code of the projecttest - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployedpackage- take the compiled code and package it in its distributable format, such as a JAR.verify- run any checks on results of integration tests to ensure quality criteria are metinstall- install the package into the local repository, for use as a dependency in other projects locallydeploy - done in the build environment, copies the final package to the remote repository for sharing with other developers and projects.
From the official documentation .
JConsole over SSH with SOCKS Proxy
This is from here : Create the SSH socks proxy locally on some free port (e.g. 7777):
ssh -fN -D 7777 user@firewalled-host
Run JConsole by specifying the SOCKS proxy (e.g. localhost:7777) and the address for the JMX server (e.g. localhost:2147)
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 service:jmx:rmi:///jndi/rmi://localhost:2147/jmxrmi -J-DsocksNonProxyHosts=
JShell
/list -start- shows modules imported at startup./edit <number>- edit that line in a new window./set editor "vi"- use vi instead of the default graphical edit pad./save abc.java- save current buffer to file./load abc.java- load from file into shell./-1- execute last snippet./1- execute first snippet./drop N- drop Nth snippet./vars- show only variables that were defined in snippets./types- show only classes that were defined in snippets.
Javap
-
javap TestDecompile.class- decompile .class file to human readable format. Does not show content of methods though. -
javap -c TestDecompile.class- show jvm bytecode in human readable -form, including methods.
Jar files
These are zip files that have a META-INF folder with a Manifest.mf
file inside.
To create a jar file:
jar -cf hello.jar HelloWorld.class
And to run:
java -cp hello.jar HelloWorld
To see contents of a jar:
jar -tf hello.jar
Runtime/debugging
-
jps- Shows all runnning java processes. -
jvisualvm- If you have it, it shows the java processes on the system with details on threads, profiler etc. -
-Xagentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=7896Use these args to start a process in debugging mode.-
agentlib=jdwp- Load thejdwpagent, for debugging. -
transport=dt_socket- for connecting a debugging client over the network. -
server=y- this one is the server half of the debugging. -
suspend=y- don’t start executing until a client debugger attaches. -
address=7896- port we listen on.
-
Maven
-
Expected directory structure: Java files are in
src/main/javaas well assrc/test/java. Resource files are undersrc/main/resourcesandsrc/test/resources. -
mvn archetype:generate: Generates a skeleton of a project based on your inputs (package name, versioning, project name, etc). -
Edit
pom.xmland set the jdk version there.. the default may be old. Java 9 onwaards doesn’t generate the.classformat. You should have this added to the default .xml file:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.11</source>
<target>1.11</target>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
mvn package- compile, test, bundle.
Interfaces
- All fields (i.e. class variables) default to
static final. All methods default topublic.
Field types
-
static- One instance per class, not per object. -
final- Initialized exactly once, either where declared or -
somewhere in the constructor. Immutable after that.
-
transient- Do not serialize/deserialize this field. -
volatile- Treat as a field that may be accessed by multiple threads. If not volatile, the value may be stored in a processor cache or registry for faster access.
Things to find out later
-
See how to create a call graph in eclipse.
-
finalkeyword?- Answer: when used with a variable, it (a) blocks reassignment,
and (b) limits existence to that block. e.g. a
final String tmp = originside a for loop cannot be reassigned with a different value. The value does not exist outside the block it is defined in. Good practice to declare this often as it means a variable is guaranteed not to change in value.
- Answer: when used with a variable, it (a) blocks reassignment,
and (b) limits existence to that block. e.g. a