=====
CS 235 - Week 14 Lecture - 2021-11-29
=====

=====
TODAY WE WILL
=====
*   announcements
*   a few words on packages and JARs
*   prep for next class

Reading:
*   Core java course text
    *   Chapter 4 - Section 4.7 - Packages
    *   Chapter 4 - Section 4.8 - JAR files

*   You should be working on Homework 9, due 11:59
    Friday, Dec. 3rd

=====
packages and JARs, oh my!
=====
*   starting with packages...
    these provide a way to collect/organize related classes
    together;

    OR if you prefer:
    Java allows you to group classes in a collection
    called a package

*   a rather common practice: to use reversed domain names
    as package names...! (since Internet domains tend to be
    unique...)

    domain horstmann.com,
    make a package com.horstmann...

    domain humboldt.edu,
    perhaps make a package edu.humboldt,
        with packages such as
        edu.humboldt.st10
	edu.humboldt.dt5
	etc.

    For CS 235 related classes,
    maybe I could put them in a package
    edu.humboldt.st10.cs235

*   fun fact: locating classes in packages is an activity
    of the compiler -- Java bytecodes use FULL package names
    for each class reference...!

*   fun opinion: really, the C++ analogs to Java's package and
    import are C++'s namespace and using

====
*   ALL Java classes are considered as being in a package --
    if one is not specified, that class is considered to be
    in the default package... or the unnamed package...
    (course text, p. 184)

=====
*   BUT, say you don't want to use the unnamed package --
    how do you DEFINE a package?
    *   STEP 1 - put a package statement at the TOP of your
        source code file, BEFORE the code that defines the
        classes in the package --

        package <desiredPkgName>;

        package edu.humboldt.st10.cs235;

    *   STEP 2 - PLACE this code in a subdirectory
        that MATCHES the full package name

    *   now classes that import the class(es) in this
        package can use them as we're used it,
        IF the directory WITH the package subdirectories
        is accessible from the CLASSPATH

        CLASSPATH - the collection of all locations
        that contain class files

        ...this can be an environment variable named CLASSPATH,
        ...this can also be specified using the -classpath
           option

*   [these worked in CS50 demo during class...]

    javac -classpath /home/ubuntu/235pkg-play:. TryPkg.java

    java -classpath /home/ubuntu/235pkg-play:. TryPkg

=====
how about JAR files?
=====
*   JAR -- Java ARchive

    a file format based on the ZIP file format
    and it is used for aggregating many files
    (including subdirectories) into one file

    *   NOT limited to .java and .class files!
        frequently also includes image files,
        audio files, subdirectories, etc.

    *   compressed!

*   you can use the jar command to make JAR files

    one way:
    jar cvf desiredJarFileName.jar file1 file2 ...

    *   IF the JAR represents a Java application,
        you can ask the jar tool to create a MANIFEST
        file that includes which class has the main method,
        and then you can have an executable JAR...

    jar cvfe DesiredJarFileName.jar fullNameOfMainClass file1 file2 ... 

    *   [these worked in CS50 demo during class...]

        jar cvfe Try2.jar TryPkg *
        jar cvfe DicePlay.jar TryJar *.class

        *   and (assuming your OS has a compatible version of the JVM
	    [Java Virtual Machine] 
	    running?) you MIGHT be able to double-click on the
	    executable jar to execute its application!

        *   or -- again assuming your OS has a compatible version
	    of the JVM running -- you can run the executable jar
	    from the command line using:

	    java -jar DicePlay.jar

	    (this worked on CS50 IDE, in a Terminal open to a directory
	    that JUST contained DicePlay.jar)