diff --git a/scripts/Makefile b/scripts/Makefile index 03ede47..e548ab1 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -1,6 +1,7 @@ MAKEFILE_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) all: \ + build/checker-framework/checker/dist/checker-qual.jar \ build/evosuite-1.2.0.jar \ build/evosuite-standalone-runtime-1.2.0.jar \ build/hamcrest-core-1.3.jar \ @@ -64,13 +65,21 @@ build/junit-4.12.jar: build/hamcrest-core-1.3.jar: mkdir -p build - cp ../subject-programs/hamcrest-core-1.3.jar build/ + cp ../subject-programs/jars/hamcrest-core-1.3.jar build/ build/major/bin/ant-replacecall: LATEST_RELEASE=$$(curl -s https://api.github.com/repos/randoop/grt-replacecall/releases/latest | grep -o '"tag_name": "[^"]*' | cut -d'"' -f4) && \ wget "https://github.com/randoop/grt-replacecall/releases/download/$${LATEST_RELEASE}/ant-replacecall" && \ mv ant-replacecall build/major/bin/ +build/checker-framework/checker/dist/checker-qual.jar: + mkdir -p build + CFVER=3.50.0 && \ + cd build && wget "https://github.com/typetools/checker-framework/releases/download/checker-framework-$${CFVER}/checker-framework-$${CFVER}.zip" && \ + unzip -o checker-framework-$${CFVER}.zip && \ + rm -rf checker-framework && \ + mv checker-framework-$${CFVER} checker-framework + build/defects4j: mkdir -p build cd build && git clone https://github.com/rjust/defects4j && cd defects4j && cpanm --installdeps . && ./init.sh diff --git a/scripts/mutation-evosuite.sh b/scripts/mutation-evosuite.sh index 51e3a71..1ff2ee4 100755 --- a/scripts/mutation-evosuite.sh +++ b/scripts/mutation-evosuite.sh @@ -172,7 +172,7 @@ echo SRC_BASE_DIR="$(realpath "$SCRIPT_DIR/../subject-programs/src/$SUBJECT_PROGRAM")" # Path to the jar file of the subject program. -SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/$SUBJECT_PROGRAM.jar") +SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/jars/$SUBJECT_PROGRAM.jar") # Number of classes in given jar file. NUM_CLASSES=$(jar -tf "$SRC_JAR" | grep -c '.class') @@ -318,7 +318,7 @@ case "$SUBJECT_PROGRAM" in "$SRC_BASE_DIR/lib/jaxen-core.jar" \ "$SRC_BASE_DIR/lib/jaxen-jdom.jar" \ "$SRC_BASE_DIR/lib/saxpath.jar" \ - "$SCRIPT_DIR/../subject-programs/jaxen-1.1.6.jar" + "$SCRIPT_DIR/../subject-programs/jars/jaxen-1.1.6.jar" ;; "joda-time-2.3") diff --git a/scripts/mutation-randoop.sh b/scripts/mutation-randoop.sh index 9fe7a9d..b9e32bf 100755 --- a/scripts/mutation-randoop.sh +++ b/scripts/mutation-randoop.sh @@ -56,12 +56,12 @@ set -o pipefail Generator=Randoop generator=randoop SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)" -SCRIPT_NAME=$(basename -- "$0") -MAJOR_HOME=$(realpath "${SCRIPT_DIR}/build/major/") # Major home directory, for mutation testing -RANDOOP_JAR=$(realpath "${SCRIPT_DIR}/build/randoop-all-4.3.4.jar") # Randoop jar file -JACOCO_AGENT_JAR=$(realpath "${SCRIPT_DIR}/build/jacocoagent.jar") # For Bloodhound -JACOCO_CLI_JAR=$(realpath "${SCRIPT_DIR}/build/jacococli.jar") # For coverage report generation -REPLACECALL_JAR=$(realpath "${SCRIPT_DIR}/build/replacecall-4.3.4.jar") # For replacing undesired method calls +MAJOR_HOME=$(realpath "${SCRIPT_DIR}/build/major/") # Major home directory, for mutation testing +RANDOOP_JAR=$(realpath "${SCRIPT_DIR}/build/randoop-all-4.3.4.jar") # Randoop jar file +JACOCO_AGENT_JAR=$(realpath "${SCRIPT_DIR}/build/jacocoagent.jar") # For Bloodhound +JACOCO_CLI_JAR=$(realpath "${SCRIPT_DIR}/build/jacococli.jar") # For coverage report generation +REPLACECALL_JAR=$(realpath "${SCRIPT_DIR}/build/replacecall-4.3.4.jar") # For replacing undesired method calls +CHECKER_QUAL_JAR=$(realpath "${SCRIPT_DIR}/build/checker-framework/checker/dist/checker-qual.jar") # For Randoop Impurity . "$SCRIPT_DIR/defs.sh" # Define shell functions. @@ -70,6 +70,7 @@ require_file "$RANDOOP_JAR" require_file "$JACOCO_AGENT_JAR" require_file "$JACOCO_CLI_JAR" require_file "$REPLACECALL_JAR" +require_file "$CHECKER_QUAL_JAR" usejdk8 JAVA_VER=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | awk -F '.' '{sub("^$", "0", $2); print ($1=="1")?$2:$1}') @@ -219,8 +220,18 @@ echo # Path to the base directory of the source code. SRC_BASE_DIR="$(realpath "$SCRIPT_DIR/../subject-programs/src/$SUBJECT_PROGRAM")" -# Path to the jar file of the subject program. -SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/$SUBJECT_PROGRAM.jar") +if [[ " ${RANDOOP_FEATURES[*]} " =~ " GRT_FUZZING " ]]; then + # If randoop features contain "GRT_FUZZING", use annotated subject program jar. + ANNOTATED_JAR="$SCRIPT_DIR/../subject-programs/annotated-jars/$SUBJECT_PROGRAM.jar" + if [ ! -f "$ANNOTATED_JAR" ]; then + echo "${SCRIPT_NAME}: error: GRT_FUZZING enabled but annotated JAR not found: $ANNOTATED_JAR" >&2 + exit 2 + fi + SRC_JAR=$(realpath "$ANNOTATED_JAR") +else + # Else, use the original subject program jar. + SRC_JAR=$(realpath "$SCRIPT_DIR/../subject-programs/jars/$SUBJECT_PROGRAM.jar") +fi # Number of classes in given jar file. NUM_CLASSES=$(jar -tf "$SRC_JAR" | grep -c '.class') @@ -353,7 +364,7 @@ case "$SUBJECT_PROGRAM" in "$SRC_BASE_DIR/lib/jaxen-core.jar" \ "$SRC_BASE_DIR/lib/jaxen-jdom.jar" \ "$SRC_BASE_DIR/lib/saxpath.jar" \ - "$SCRIPT_DIR/../subject-programs/jaxen-1.1.6.jar" + "$SCRIPT_DIR/../subject-programs/jars/jaxen-1.1.6.jar" ;; "joda-time-2.3") @@ -456,7 +467,7 @@ RANDOOP_BASE_COMMAND=( -Xbootclasspath/a:"$JACOCO_AGENT_JAR:$REPLACECALL_JAR" -javaagent:"$JACOCO_AGENT_JAR" -javaagent:"$REPLACECALL_COMMAND" - -classpath "$RANDOOP_CLASSPATH:$RANDOOP_JAR" + -classpath "$RANDOOP_CLASSPATH:$RANDOOP_JAR:$CHECKER_QUAL_JAR" randoop.main.Main gentests --testjar="$TARGET_JAR" diff --git a/subject-programs/annotated-jars/ClassViewer-5.0.5b.jar b/subject-programs/annotated-jars/ClassViewer-5.0.5b.jar new file mode 100644 index 0000000..62f0506 Binary files /dev/null and b/subject-programs/annotated-jars/ClassViewer-5.0.5b.jar differ diff --git a/subject-programs/annotated-jars/JSAP-2.1.jar b/subject-programs/annotated-jars/JSAP-2.1.jar new file mode 100644 index 0000000..4199347 Binary files /dev/null and b/subject-programs/annotated-jars/JSAP-2.1.jar differ diff --git a/subject-programs/annotated-jars/README.md b/subject-programs/annotated-jars/README.md new file mode 100644 index 0000000..47f6dc4 --- /dev/null +++ b/subject-programs/annotated-jars/README.md @@ -0,0 +1,66 @@ +# Annotated Subject Program JARs + +This folder holds subject JARs with purity annotations: `@Pure`, +`@SideEffectFree`, `@Impure`, and related qualifiers from +`org.checkerframework.framework.qual` Compared to `subject-programs/jars/`, the +compiled bytecode here is the same, but the class files have purity +annotations. No other code or resources are altered. + +The annotations are produced by the Checker Framework whole-program inference. + +## Why the annotations matter + +The `GRT_FUZZING` feature in `scripts/mutation-randoop.sh` prioritizes impure +calls to mutate an object's state before exercising additional API entry points. +The annotations provide the information it needs. + +## Rebuilding an annotated JAR + +1. **Fetch sources**: Run `scripts/get-all-subject-src.sh` to populate + `subject-programs/src//`. +2. **Build the plain JAR**: In the subject directory, run the build command + found in `subject-programs/README.build`. The result lands in + `subject-programs/jars/` or the subject's usual build folder. +3. **Set up inference tooling**: Point your environment at the local Checker + Framework build: + + ```sh + export CHECKERFRAMEWORK=/path/to/grt-testing/scripts/build/checker-framework + export PATH="$CHECKERFRAMEWORK/annotation-file-utilities/bin:$PATH" + export JAVAC_JAR="$CHECKERFRAMEWORK/checker/dist/javac.jar" + ``` + +4. **Set the classpath**: Start with the JAR you just built, then + append any dependencies: + - Ant projects usually ship extra JARs in a local `jars/` or `lib/` folder. + - Maven projects can generate a classpath with + `mvn -q dependency:build-classpath -Dmdep.outputFile=target/wpi-classpath.txt`. +5. **Run inference**: From the subject directory, execute: + + ```sh + $CHECKERFRAMEWORK/checker/bin/infer-and-annotate.sh \ + "org.checkerframework.framework.util.PurityChecker" \ + "$RUNTIME_CLASSPATH" \ + $(find src -name "*.java") + ``` + + The script rewrites the sources in place with the inferred annotations. +6. **Rebuild**: Repeat the command from step 2 to produce an annotated JAR. + Copy it to this folder. + +### Worked example (a4j-1.0b) + +```sh +cd subject-programs/src/a4j-1.0b +ant createJar # build the baseline JAR +export CHECKERFRAMEWORK=... # reuse the env vars above +export PATH="$CHECKERFRAMEWORK/annotation-file-utilities/bin:$PATH" +export JAVAC_JAR="$CHECKERFRAMEWORK/checker/dist/javac.jar" +RUNTIME_CLASSPATH="../../jars/a4j-1.0b.jar:jars/jox116.jar:jars/log4j-1.2.4.jar" +$CHECKERFRAMEWORK/checker/bin/infer-and-annotate.sh \ + "org.checkerframework.framework.util.PurityChecker" \ + "$RUNTIME_CLASSPATH" \ + $(find src -name "*.java") +ant createJar # rebuild with annotations +cp dist/a4j.jar ../../annotated-jars/a4j-1.0b.jar +``` diff --git a/subject-programs/annotated-jars/a4j-1.0b.jar b/subject-programs/annotated-jars/a4j-1.0b.jar new file mode 100644 index 0000000..932d79b Binary files /dev/null and b/subject-programs/annotated-jars/a4j-1.0b.jar differ diff --git a/subject-programs/annotated-jars/asm-5.0.1.jar b/subject-programs/annotated-jars/asm-5.0.1.jar new file mode 100644 index 0000000..7619c3f Binary files /dev/null and b/subject-programs/annotated-jars/asm-5.0.1.jar differ diff --git a/subject-programs/annotated-jars/bcel-5.2.jar b/subject-programs/annotated-jars/bcel-5.2.jar new file mode 100644 index 0000000..4227144 Binary files /dev/null and b/subject-programs/annotated-jars/bcel-5.2.jar differ diff --git a/subject-programs/annotated-jars/commons-cli-1.2.jar b/subject-programs/annotated-jars/commons-cli-1.2.jar new file mode 100644 index 0000000..200e307 Binary files /dev/null and b/subject-programs/annotated-jars/commons-cli-1.2.jar differ diff --git a/subject-programs/annotated-jars/commons-codec-1.9.jar b/subject-programs/annotated-jars/commons-codec-1.9.jar new file mode 100644 index 0000000..296670c Binary files /dev/null and b/subject-programs/annotated-jars/commons-codec-1.9.jar differ diff --git a/subject-programs/annotated-jars/commons-collections4-4.0.jar b/subject-programs/annotated-jars/commons-collections4-4.0.jar new file mode 100644 index 0000000..69679fe Binary files /dev/null and b/subject-programs/annotated-jars/commons-collections4-4.0.jar differ diff --git a/subject-programs/annotated-jars/commons-compress-1.8.jar b/subject-programs/annotated-jars/commons-compress-1.8.jar new file mode 100644 index 0000000..2bd4ac4 Binary files /dev/null and b/subject-programs/annotated-jars/commons-compress-1.8.jar differ diff --git a/subject-programs/annotated-jars/commons-lang3-3.0.jar b/subject-programs/annotated-jars/commons-lang3-3.0.jar new file mode 100644 index 0000000..f367f4b Binary files /dev/null and b/subject-programs/annotated-jars/commons-lang3-3.0.jar differ diff --git a/subject-programs/annotated-jars/commons-math3-3.2.jar b/subject-programs/annotated-jars/commons-math3-3.2.jar new file mode 100644 index 0000000..0443cd9 Binary files /dev/null and b/subject-programs/annotated-jars/commons-math3-3.2.jar differ diff --git a/subject-programs/annotated-jars/commons-primitives-1.0.jar b/subject-programs/annotated-jars/commons-primitives-1.0.jar new file mode 100644 index 0000000..ccf0d0a Binary files /dev/null and b/subject-programs/annotated-jars/commons-primitives-1.0.jar differ diff --git a/subject-programs/annotated-jars/dcParseArgs-10.2008.jar b/subject-programs/annotated-jars/dcParseArgs-10.2008.jar new file mode 100644 index 0000000..f864f55 Binary files /dev/null and b/subject-programs/annotated-jars/dcParseArgs-10.2008.jar differ diff --git a/subject-programs/annotated-jars/easymock-3.2.jar b/subject-programs/annotated-jars/easymock-3.2.jar new file mode 100644 index 0000000..d38fe25 Binary files /dev/null and b/subject-programs/annotated-jars/easymock-3.2.jar differ diff --git a/subject-programs/annotated-jars/fixsuite-r48.jar b/subject-programs/annotated-jars/fixsuite-r48.jar new file mode 100644 index 0000000..c3e1ccc Binary files /dev/null and b/subject-programs/annotated-jars/fixsuite-r48.jar differ diff --git a/subject-programs/annotated-jars/guava-16.0.1.jar b/subject-programs/annotated-jars/guava-16.0.1.jar new file mode 100644 index 0000000..442f21f Binary files /dev/null and b/subject-programs/annotated-jars/guava-16.0.1.jar differ diff --git a/subject-programs/annotated-jars/hamcrest-core-1.3.jar b/subject-programs/annotated-jars/hamcrest-core-1.3.jar new file mode 100644 index 0000000..5b01097 Binary files /dev/null and b/subject-programs/annotated-jars/hamcrest-core-1.3.jar differ diff --git a/subject-programs/annotated-jars/javassist-3.19.jar b/subject-programs/annotated-jars/javassist-3.19.jar new file mode 100644 index 0000000..d2918c1 Binary files /dev/null and b/subject-programs/annotated-jars/javassist-3.19.jar differ diff --git a/subject-programs/annotated-jars/javax.mail-1.5.1.jar b/subject-programs/annotated-jars/javax.mail-1.5.1.jar new file mode 100644 index 0000000..e80d440 Binary files /dev/null and b/subject-programs/annotated-jars/javax.mail-1.5.1.jar differ diff --git a/subject-programs/annotated-jars/jaxen-1.1.6.jar b/subject-programs/annotated-jars/jaxen-1.1.6.jar new file mode 100644 index 0000000..96f17eb Binary files /dev/null and b/subject-programs/annotated-jars/jaxen-1.1.6.jar differ diff --git a/subject-programs/annotated-jars/jcommander-1.35.jar b/subject-programs/annotated-jars/jcommander-1.35.jar new file mode 100644 index 0000000..09062ae Binary files /dev/null and b/subject-programs/annotated-jars/jcommander-1.35.jar differ diff --git a/subject-programs/annotated-jars/jdom-1.0.jar b/subject-programs/annotated-jars/jdom-1.0.jar new file mode 100644 index 0000000..987c406 Binary files /dev/null and b/subject-programs/annotated-jars/jdom-1.0.jar differ diff --git a/subject-programs/annotated-jars/joda-time-2.3.jar b/subject-programs/annotated-jars/joda-time-2.3.jar new file mode 100644 index 0000000..dca3b3c Binary files /dev/null and b/subject-programs/annotated-jars/joda-time-2.3.jar differ diff --git a/subject-programs/annotated-jars/jvc-1.1.jar b/subject-programs/annotated-jars/jvc-1.1.jar new file mode 100644 index 0000000..a85f496 Binary files /dev/null and b/subject-programs/annotated-jars/jvc-1.1.jar differ diff --git a/subject-programs/annotated-jars/nekomud-r16.jar b/subject-programs/annotated-jars/nekomud-r16.jar new file mode 100644 index 0000000..51e6e8e Binary files /dev/null and b/subject-programs/annotated-jars/nekomud-r16.jar differ diff --git a/subject-programs/annotated-jars/pmd-core-5.2.2.jar b/subject-programs/annotated-jars/pmd-core-5.2.2.jar new file mode 100644 index 0000000..a8a71e1 Binary files /dev/null and b/subject-programs/annotated-jars/pmd-core-5.2.2.jar differ diff --git a/subject-programs/annotated-jars/sat4j-core-2.3.5.jar b/subject-programs/annotated-jars/sat4j-core-2.3.5.jar new file mode 100644 index 0000000..7fae405 Binary files /dev/null and b/subject-programs/annotated-jars/sat4j-core-2.3.5.jar differ diff --git a/subject-programs/annotated-jars/shiro-core-1.2.3.jar b/subject-programs/annotated-jars/shiro-core-1.2.3.jar new file mode 100644 index 0000000..edac48c Binary files /dev/null and b/subject-programs/annotated-jars/shiro-core-1.2.3.jar differ diff --git a/subject-programs/annotated-jars/slf4j-api-1.7.12.jar b/subject-programs/annotated-jars/slf4j-api-1.7.12.jar new file mode 100644 index 0000000..acc368f Binary files /dev/null and b/subject-programs/annotated-jars/slf4j-api-1.7.12.jar differ diff --git a/subject-programs/annotated-jars/tiny-sql-2.26.jar b/subject-programs/annotated-jars/tiny-sql-2.26.jar new file mode 100644 index 0000000..a995ac9 Binary files /dev/null and b/subject-programs/annotated-jars/tiny-sql-2.26.jar differ diff --git a/subject-programs/ClassViewer-5.0.5b.jar b/subject-programs/jars/ClassViewer-5.0.5b.jar similarity index 100% rename from subject-programs/ClassViewer-5.0.5b.jar rename to subject-programs/jars/ClassViewer-5.0.5b.jar diff --git a/subject-programs/JSAP-2.1.jar b/subject-programs/jars/JSAP-2.1.jar similarity index 100% rename from subject-programs/JSAP-2.1.jar rename to subject-programs/jars/JSAP-2.1.jar diff --git a/subject-programs/a4j-1.0b.jar b/subject-programs/jars/a4j-1.0b.jar similarity index 100% rename from subject-programs/a4j-1.0b.jar rename to subject-programs/jars/a4j-1.0b.jar diff --git a/subject-programs/asm-5.0.1.jar b/subject-programs/jars/asm-5.0.1.jar similarity index 100% rename from subject-programs/asm-5.0.1.jar rename to subject-programs/jars/asm-5.0.1.jar diff --git a/subject-programs/bcel-5.2.jar b/subject-programs/jars/bcel-5.2.jar similarity index 100% rename from subject-programs/bcel-5.2.jar rename to subject-programs/jars/bcel-5.2.jar diff --git a/subject-programs/commons-cli-1.2.jar b/subject-programs/jars/commons-cli-1.2.jar similarity index 100% rename from subject-programs/commons-cli-1.2.jar rename to subject-programs/jars/commons-cli-1.2.jar diff --git a/subject-programs/commons-codec-1.9.jar b/subject-programs/jars/commons-codec-1.9.jar similarity index 100% rename from subject-programs/commons-codec-1.9.jar rename to subject-programs/jars/commons-codec-1.9.jar diff --git a/subject-programs/commons-collections4-4.0.jar b/subject-programs/jars/commons-collections4-4.0.jar similarity index 100% rename from subject-programs/commons-collections4-4.0.jar rename to subject-programs/jars/commons-collections4-4.0.jar diff --git a/subject-programs/commons-compress-1.8.jar b/subject-programs/jars/commons-compress-1.8.jar similarity index 100% rename from subject-programs/commons-compress-1.8.jar rename to subject-programs/jars/commons-compress-1.8.jar diff --git a/subject-programs/commons-lang3-3.0.jar b/subject-programs/jars/commons-lang3-3.0.jar similarity index 100% rename from subject-programs/commons-lang3-3.0.jar rename to subject-programs/jars/commons-lang3-3.0.jar diff --git a/subject-programs/commons-math3-3.2.jar b/subject-programs/jars/commons-math3-3.2.jar similarity index 100% rename from subject-programs/commons-math3-3.2.jar rename to subject-programs/jars/commons-math3-3.2.jar diff --git a/subject-programs/commons-primitives-1.0.jar b/subject-programs/jars/commons-primitives-1.0.jar similarity index 100% rename from subject-programs/commons-primitives-1.0.jar rename to subject-programs/jars/commons-primitives-1.0.jar diff --git a/subject-programs/dcParseArgs-10.2008.jar b/subject-programs/jars/dcParseArgs-10.2008.jar similarity index 100% rename from subject-programs/dcParseArgs-10.2008.jar rename to subject-programs/jars/dcParseArgs-10.2008.jar diff --git a/subject-programs/easymock-3.2.jar b/subject-programs/jars/easymock-3.2.jar similarity index 100% rename from subject-programs/easymock-3.2.jar rename to subject-programs/jars/easymock-3.2.jar diff --git a/subject-programs/fixsuite-r48.jar b/subject-programs/jars/fixsuite-r48.jar similarity index 100% rename from subject-programs/fixsuite-r48.jar rename to subject-programs/jars/fixsuite-r48.jar diff --git a/subject-programs/guava-16.0.1.jar b/subject-programs/jars/guava-16.0.1.jar similarity index 100% rename from subject-programs/guava-16.0.1.jar rename to subject-programs/jars/guava-16.0.1.jar diff --git a/subject-programs/hamcrest-core-1.3.jar b/subject-programs/jars/hamcrest-core-1.3.jar similarity index 100% rename from subject-programs/hamcrest-core-1.3.jar rename to subject-programs/jars/hamcrest-core-1.3.jar diff --git a/subject-programs/javassist-3.19.jar b/subject-programs/jars/javassist-3.19.jar similarity index 100% rename from subject-programs/javassist-3.19.jar rename to subject-programs/jars/javassist-3.19.jar diff --git a/subject-programs/javax.mail-1.5.1.jar b/subject-programs/jars/javax.mail-1.5.1.jar similarity index 100% rename from subject-programs/javax.mail-1.5.1.jar rename to subject-programs/jars/javax.mail-1.5.1.jar diff --git a/subject-programs/jaxen-1.1.6.jar b/subject-programs/jars/jaxen-1.1.6.jar similarity index 100% rename from subject-programs/jaxen-1.1.6.jar rename to subject-programs/jars/jaxen-1.1.6.jar diff --git a/subject-programs/jcommander-1.35.jar b/subject-programs/jars/jcommander-1.35.jar similarity index 100% rename from subject-programs/jcommander-1.35.jar rename to subject-programs/jars/jcommander-1.35.jar diff --git a/subject-programs/jdom-1.0.jar b/subject-programs/jars/jdom-1.0.jar similarity index 100% rename from subject-programs/jdom-1.0.jar rename to subject-programs/jars/jdom-1.0.jar diff --git a/subject-programs/joda-time-2.3.jar b/subject-programs/jars/joda-time-2.3.jar similarity index 100% rename from subject-programs/joda-time-2.3.jar rename to subject-programs/jars/joda-time-2.3.jar diff --git a/subject-programs/jvc-1.1.jar b/subject-programs/jars/jvc-1.1.jar similarity index 100% rename from subject-programs/jvc-1.1.jar rename to subject-programs/jars/jvc-1.1.jar diff --git a/subject-programs/nekomud-r16.jar b/subject-programs/jars/nekomud-r16.jar similarity index 100% rename from subject-programs/nekomud-r16.jar rename to subject-programs/jars/nekomud-r16.jar diff --git a/subject-programs/pmd-core-5.2.2.jar b/subject-programs/jars/pmd-core-5.2.2.jar similarity index 100% rename from subject-programs/pmd-core-5.2.2.jar rename to subject-programs/jars/pmd-core-5.2.2.jar diff --git a/subject-programs/sat4j-core-2.3.5.jar b/subject-programs/jars/sat4j-core-2.3.5.jar similarity index 100% rename from subject-programs/sat4j-core-2.3.5.jar rename to subject-programs/jars/sat4j-core-2.3.5.jar diff --git a/subject-programs/shiro-core-1.2.3.jar b/subject-programs/jars/shiro-core-1.2.3.jar similarity index 100% rename from subject-programs/shiro-core-1.2.3.jar rename to subject-programs/jars/shiro-core-1.2.3.jar diff --git a/subject-programs/slf4j-api-1.7.12.jar b/subject-programs/jars/slf4j-api-1.7.12.jar similarity index 100% rename from subject-programs/slf4j-api-1.7.12.jar rename to subject-programs/jars/slf4j-api-1.7.12.jar diff --git a/subject-programs/tiny-sql-2.26.jar b/subject-programs/jars/tiny-sql-2.26.jar similarity index 100% rename from subject-programs/tiny-sql-2.26.jar rename to subject-programs/jars/tiny-sql-2.26.jar