CS636 Java/Maven Development Setup: on Linux at cs.umb.edu and on your home machine, Spring 2021

We are using the Linux system pe07.cs.umb.edu. Make sure you can login to it as soon as possible. We will use Java for programming and Maven for building our programs.

Linux at cs.umb.edu: Java setup.
For Linux systems such as users.cs.umb.edu and our system, topcat.cs.umb.edu, you should not need to do any setup to use java and maven. To make sure the java and maven are recent-enough versions, simply use the commands under Linux java and setup tests below.  To check that java and javac are in /usr/bin as expected, use the "which"; command as follows:

    $ which javac
    /usr/bin/javac

Linux at cs.umb.edu:  editors Hopefully you know emacs or vi or another Linux editor.  We will do most of our software development on PCs, and then test the systems on Linux at cs.umb.edu for final delivery. This works well because of the robust portability of Java. Project deliveries are to the Linux filesystem at cs.umb.edu. See AccessToCSHosts.html for more info on file transfers.

Linux at pe07.cs.umb.edu: java setup test:

java -version   should output
openjdk version "1.8.0_275" or more recent version, plus two more lines of text

env|grep CLASSPATH    should output nothing.  If it does give output, try to hunt down the source, usually in .profile or .bashrc, or files they invoke.

Add JAVA_HOME to your environment variables at cs.umb.edu. Note that your home directory is the same on users.cs.umb.edu as on pe07.cs.umb.edu, or any other Linux server in our network, so you can edit .profile or create a new .profile file there to set up your environment for any host on our network. Add this line to .profile in your home directory (creating the file if not there already):  
export JAVA_HOME=/usr

Then log out and in again to put it in action and then test it with 
env|grep JAVA   which should output

JAVA_PATH=/usr

Linux at cs.umb.edu:  Maven setup test: the command is "mvn". Note that Maven depends on the JAVA_HOME setting set up above.

mvn -version     should output
Apache Maven 3.3.9 or later

Home System Software Setup

For logging in to cs.umb.edu systems from home PCs and transferring files, see AccessToCSHosts

Browser

We will use Chrome as the default browser. Please install it if you don't have it already.ava setup on home systems

Java for Linux or Mac OSX:

First see what java is already there by using "java -version"; and "javac -version";. If these versions agree and show 1.8.xx or higher (current is 11.0.2), you do not need to download the JDK.  For Linux, you may be able to install a newer Java JDK by using the package system of your Linux distribution. For the Ubuntu Linux, see http://tecadmin.net/install-oracle-java-8-jdk-8-ubuntu-via-ppa/#

Java for Windows

Assume you need to download Java's JDK, unless you have previously set up Java for development.

Downloading Java from Oracle - We will be using Java 8 or higher (except Java 9) from Oracle.  Everything we need from Oracle is in the Java SE (Java Standard Edition) download, that is, the  JDK (Java Development Kit) for Java 8 or higher.  Note that the JRE (Java runtime environment) is not enough. Download and install the latest JDK (Java SE Development Kit) from https://www.oracle.com/java/technologies/javase-jdk15-downloads.html. For Windows, download the .exe installation tool and run it. For Mac, download the .dmg and run it. Java 15 can be used as a maintenance release of Java 8, 7 or Java 6 for normal Java programming. Since pe07 is running Java 8, expect to recompile your sources after transferring them to pe07.

If you already have the Java 8 or higher JDK downloaded from Oracle, that's good enough. Or you can get the open source version of Java 15 from https://jdk.java.net/15/.

JAVA_HOME and PATH Environment Variables  

The environment variable JAVA_HOME tells where the JDK is located on the system (Windows, Linux, or MacOSX). Specifically, it is the directory with a bin subdirectory containing java and javac.  JAVA_HOME is used by programs (other than java and javac) that need access to resources in the JDK, in particular maven, our build tool.

The environment variable PATH holds the search path used by the system (Windows, Linux, or MacOSX) to locate executables. When we add a new executable located in a directory not listed in PATH, we need to add its directory to PATH, so we can run the program from anywhere on the system. How to do this depends on the system as follows.

JAVA_HOME and PATH for a Windows machine: Use System Control Panel>Advanced>Environment to define the JAVA_HOME user environment variable as c:\Program Files\Java\jdk-15.0.2 or C:\Program Files\Java\jdk1.8.0_xxx  or wherever you have the JDK. There is a shortcut method to get to this control panel, as follows. Click the Start button, fill in "envir" in the text box, and click on "Edit Environment Variables for your account", add JAVA_HOME as c:\Program Files\Java\jdk-15.0.2 or wherever you put the JDK download.Then edit your user Path environment variable to include your JDK's bin directory, using %JAVA_HOME%\bin as its value, or the explicit path such as C:\Program Files\Java\jdk1.8.0_xxx\bin. Use a semicolon between entries in the value of Path. For example, my Path value has c:\Program Files\emacs\bin; %JAVA_HOME%\bin.    Test the environment variables by creating a new command window and using the "set" command.

JAVA_HOME and PATH for a Linux machine: It should work to add the environment variables to .profile (or .bashrc or .bash_profile possibly, non-Ubuntu Linux) in your home directory. For example, if javac is in /usr/bin, add this line to .profile (creating the file .profile if not there already):

  export JAVA_HOME=/usr

If you have downloaded Java to /usr/local/jdk11.0.2 (say), then put "export JAVA_HOME=/usr/local/jdk11.0.2"; in .profile. If you did the download through a package system like apt-get for Ubuntu, you may not need to do anything extra to get the new java and javac on your Path, so check the resulting versions by "java -version" and "javac -version". If these fail or show an old version, you need further work. Ubuntu/Debian Linux has "update-alternatives"; for handling multiple versions of Java on the system, but it is somewhat difficult to use. The straightforward way is to edit your PATH environment variable setup in .profile.  Suppose the old PATH (reported by "echo $PATH";) is :/usr/local/bin:/bin:/usr/bin  Then add this line to .profile:

   export PATH=$PATH:/usr/local/jdk11.0.2 /bin

Note the colons between directories on the PATH, vs. semicolons for the Windows PATH. If java and javac are in /usr/bin, you don't need to modify the PATH because it already has this driectory.

This should be executed when you open a new shell window, but if that doesn't work, you can execute it explicitly by "source .profile".

Test the environment variables by creating a new shell window and using the "env" command, or for example "echo $JAVA_HOME";.

JAVA_HOME and PATH for a MacOSX machine: Don't even try to Google this topic (environment variables on Mac OSX), because you will only find a confusing contradictory morass.

From the Terminal application, i.e., the UNIX shell, MacOSX works very much like Linux, except that .profile is called .bash_profile. Put the following line in .bash_profile in your home directory, creating a new file if necessary. After download from Oracle of the .dmg and its installation, you should have java and javac available in /usr/bin, same as many Linux systems.

export JAVA_HOME=/usr                 in .bash_profile in your home directory. Don't put spaces around the = sign.

Then create a new Terminal (flower-N is the shortcut) and check by "echo $JAVA_HOME"; in Terminal. Try the Java setup test below. This will establish the needed environment variables for command line work, i.e., commands in Terminal. However, we also need to use environment variables inside eclipse, a GUI program normally executed from an icon in the dock. There is no single way to set up global environment variables for all recent versions of Mac OSX. Instead, what we can do is either run eclipse from Terminal (cd to the directory containing file "eclipse" and use eclipse, or possibly ./eclipse, as a command), or wrap it in a shell script and put the shell script in the dock. See "eclipse on Mac" below.

Java setup test

Note: use a brand new command window or shell if you just changed your environment variables.

1. Windows    set|find "JAVA"      should output
  JAVA_HOME=c:\Program Files\Java\jdk-15.0.2          or whatever you specified as the JDK directory

Linux/Mac:      env|grep JAVA    should output
  JAVA_HOME=/usr
unless you are using a distribution in another area.

2. On Windows, the path command outputs the operational Path value, which is the system Path value appended with the user Path value you set up in the control panel, so near the end of the displayed path, you should see ;c:\Program Files\Java\jdk-15.0.2\bin. On Linux or Mac OSX, echo $PATH  outputs the current PATH variable. And in Mac/Linux, for a single executable, you can use the which command to see where the executable is found, so for example "which java" should return /usr/bin.

3. java -version should output:

    java version  "15.0.2" if new, or if Java 8,  "1.8.0_xxx"   or similar where xx is two or three digits

Windows Failure case:  All set up as above, but java -version shows java 1.7.x (or some other wrong version). Look for a java.exe in C:\Program Files (x86)\Common Files\Oracle\Java\javapath directory.  Delete it or rename it to java_hold.exe (run CMD as administrator for this by right-clicking its icon and selection "run as administrator", or log in as Administrator and use Windows Explorer.)
Mac/Linux Failure case:  All set up as above, but java -version shows java 1.7.x (or some other wrong version). Look for java in /usr/bin. Just rename it to java_hold (cd /usr/bin; sudo mv java java_hold) . If it's not in /usr/bin, find it using "which java". This will print out where it's found on the system search path.

4. javac -version                   should output the same version, say
  javac 15.0.2                        or matching java's version if Java 8

5. On Windows, set|find "CLASSPATH"    should output nothing. Similarly, env|grep CLASSPATH should output nothing on Mac/Linux  If it does give output, look for an old environment variable setting and delete it.

Eclipse (version 2020-06 or later): Eclipse IDE for Enterprise Java Developers

It's best to have Java working first, then install eclipse, so that eclipse can find the new JDK on its own.  But if you install eclipse before Java, you can configure the new JDK in eclipse as shown in step 2. below.

  1. Install the "Eclipse IDE for Enterprise Java Developers" from https://www.eclipse.org/downloads/packages/.This also free.  If you have an older version of eclipse, upgrade now, because each new version has important new features and fixes. Try out eclipse as a Java IDE if you don't already know it.
  2. Make sure eclipse sees your Java 8+ JDK by visiting Window>Preferences>Java>Installed JREs (Mac: Eclipse>Preferences>Java>Installed JREs), and looking for the Java JDK. If it's not there, click the Add button, and fill in:
       JRE name: jdk8 (or similar)
       JRE home directory: c:\Program Files\Java\jdk1.8.xxx  (or on Mac,  /Library/Java/JavaVirtualMachines/jdk1.8._xxx.jdk/Contents/Home/) and clicking OK.  Then make sure it is checked as the default JRE in the "Installed JREs" window you should return to.

Eclipse on Mac OSX

As discussed under environment variables above, it is challenging to get environment variables to work inside Mac applications launched from the dock. You can launch eclipse from Terminal by using the "open -a" command, so "open -a Eclipse", assuming Eclipse.app is in your Applications directory. This way, your environment variables will be defined inside eclipse.

The useful command "Open projects from file system" may not be obvious on the Mac. It's available from the menu bar at the top of the screen.

Eclipse tricks worth knowing:

Maven 3.6.3

Download maven from https://maven.apache.org/download.cgi, using the binary zip archive. You should already have the needed JAVA_HOME environment variable set up, discussed under the Java setup above.

On Windows, download the zip and expand it into some convenient directory, say c:\apache-maven-3.6.3. Then edit your PATH environment variable to include c:\apache-maven-3.6.3\bin.

On Mac and Linux systems, download the zip and expand it the default way, which does its work in Downloads. Then use the shell/Terminal to "cd Downloads" from your home directory and "ls" and you should see a directory apache-maven-3.6.3. Move it to your login directory with "mv apache-maven-3.6.3 ..". Then edit your .bash_profile (Mac) or .profile (Linux) to be:

export JAVA_HOME=/usr
export PATH=$PATH:/Users/yourusername/apache-maven-3.6.0/bin:.              (that's a colon, then a dot at the end)

The inclusion of . on the path allows you to run scripts in a directory by their simple names, like "runit.sh" rather than needing to put "./runit.sh" for example.

For more information on installation, see http://www.mkyong.com/tutorials/maven-tutorials/

Maven Test

mvn -v    should output its version 3.6.3, etc.

The needed Maven pom.xml files for projects will be supplied, and probably do not need to be edited, but it is important to understand their basic operation. This will be covered in class. Eclipse supports maven, and marks a project with an M if it sees a pom.xml in it. Whenever you edit pom.xml, you need to update your eclipse project by project>right-click>Maven>Update Project.

Eclipse and Maven

A maven project in eclipse gets access to the Maven repository of jar files. To get the best development and debugging environment, go to Window>Preferences>Maven and check Download Artifact Sources and Download Artifact Javadoc. Then eclipse will know the method signatures of the methods of the libraries in use (except for some that appear to be without available Javadoc), support code completion, and even let you dive into the library sources using the debugger.

Maven on pe07.cs.umb.edu possibly causing over-disk-quota problem

Sometimes the maven repository, situated by default at ~/.m2/repository (.m2 is a dot file, so use ls -a to see it), gets so large that it runs your account over your diskspace quota. In that case, you need to relocate it to ~/cs636/repository by putting a file named settings.xml in ~/.m2 with contents:

<settings>
    <localRepository>/home/username/cs636/repository</localRepository>
</settings>

This will place it in the diskspace allocated for cs636 work, not under your personal quota.