- Java 17 or higher (OpenJDK recommended)
- Download from Eclipse Temurin or Oracle
- Verify installation:
java -version - Must have
JAVA_HOMEenvironment variable set
- Git version control
- Download Git
- Verify installation:
git --version
- IntelliJ IDEA (Community or Ultimate)
- Download IntelliJ IDEA
- Alternative: Eclipse IDE with Java EE support
- Alternative: Visual Studio Code with Java extensions
The following are automatically downloaded and managed by Gradle - you don't need to install these:
- Open Liberty server runtime
- Apache Derby database drivers
- Joda-Time library (legacy dependency)
- JSTL (JSP Standard Tag Library)
- Servlet API specifications
- JUnit 5 testing framework (when tests are added)
- Gradle Wrapper (included in project)
- Liberty Gradle Plugin for server management
- War Plugin for web application packaging
- All build and runtime dependencies defined in
build.gradle
git clone https://github.com/sourcegraph/training-java-monolith-refactor.git
cd big-bad-monolithjava -version
javac -version
echo $JAVA_HOME # Linux/macOS
echo %JAVA_HOME% # WindowsExpected output: Java 17+ version information
# Initial build (downloads all dependencies)
./gradlew build
# Clean build if needed
./gradlew clean buildWhat happens during build:
- Gradle downloads Liberty server runtime
- Downloads all Java dependencies
- Compiles Java source code
- Packages application as WAR file
- No tests run (they don't exist yet - part of training!)
# Linux/macOS
./liberty-dev.sh
# Windows
liberty-dev.bat./gradlew libertyStart
./gradlew libertyDeploy- Open browser to: http://localhost:9080/big-bad-monolith/
- You should see the application dashboard
- Test navigation to different pages (customers, hours, reports)
-
Import Project
- File → Open → Select
big-bad-monolithdirectory - Choose "Import Gradle project"
- Use Gradle wrapper
- File → Open → Select
-
Configure Project SDK
- File → Project Structure → Project
- Set Project SDK to Java 17+
-
Enable Auto-Import
- File → Settings → Build → Gradle
- Check "Auto-import"
-
Import Project
- File → Import → Existing Gradle Project
- Select
big-bad-monolithdirectory
-
Configure Build Path
- Right-click project → Properties → Java Build Path
- Verify Java 17+ is selected
Set these environment variables for optimal development:
# Required
export JAVA_HOME=/path/to/java17
# Optional (for development)
export GRADLE_OPTS="-Xmx2g -XX:MaxMetaspaceSize=512m"
export JAVA_OPTS="-Xmx1g"big-bad-monolith/
├── src/main/java/ # Java source code
│ └── com/sourcegraph/demo/
├── src/main/webapp/ # JSP files and web resources
├── src/test/java/ # Test code (to be created)
├── build/ # Generated build files
├── data/ # Derby database files
├── gradle/ # Gradle wrapper files
├── logs/ # Liberty server logs
└── build.gradle # Build configuration
# Build application
./gradlew build
# Clean and rebuild
./gradlew clean build
# Compile only (no packaging)
./gradlew compileJava
# Run tests (when they exist)
./gradlew test
# Generate WAR file
./gradlew war# Start server
./gradlew libertyStart
# Stop server
./gradlew libertyStop
# Deploy application
./gradlew libertyDeploy
# Check server status
./gradlew libertyStatus
# Development mode with hot reload
./liberty-dev.sh-
Problem:
JAVA_HOME not set- Solution: Set JAVA_HOME environment variable to Java installation path
-
Problem:
java.lang.UnsupportedClassVersionError- Solution: Upgrade to Java 17 or higher
-
Problem:
Permission denied: ./gradlew- Solution:
chmod +x gradlew(Linux/macOS)
- Solution:
-
Problem: Build fails with dependency errors
- Solution:
./gradlew clean build --refresh-dependencies
- Solution:
-
Problem: Port 9080 already in use
- Solution: Stop other applications or change port in
build.gradle
- Solution: Stop other applications or change port in
-
Problem: Derby database locked
- Solution: Stop Liberty server, delete
data/directory, restart
- Solution: Stop Liberty server, delete
-
Problem: Hot reload not working
- Solution: Use Liberty dev mode:
./liberty-dev.sh
- Solution: Use Liberty dev mode:
-
Problem: Database corruption or strange data
- Solution: Delete
data/directory and restart application
- Solution: Delete
-
Problem: Connection timeout errors
- Solution: Restart Liberty server:
./gradlew libertyStop libertyStart
- Solution: Restart Liberty server:
- JSP Changes: Auto-reload in Liberty dev mode
- Java Changes: Compile with
./gradlew compileJava - Configuration Changes: Restart server
- Database Schema Changes: Delete
data/directory
- Edit
build.gradle - Add dependency to appropriate configuration block
- Run
./gradlew build --refresh-dependencies
# All tests
./gradlew test
# Specific test class
./gradlew test --tests "CustomerDAOTest"
# Specific test method
./gradlew test --tests "CustomerDAOTest.testFindById"
# Tests with output
./gradlew test --info- Liberty dev mode provides hot reload but may be slower
- Use standard server mode for performance testing
- Gradle daemon improves build times (enabled by default)
- Use
./gradlew build --parallelfor faster builds - Consider increasing Gradle heap size:
export GRADLE_OPTS="-Xmx2g"
- SQL injection vulnerabilities
- Null pointer exception vulnerabilities
- Resource management issues
Do not deploy this application to production environments!
- Liberty Server:
logs/messages.log - Application:
logs/trace.log - Derby Database:
derby.log - Gradle: Build output in terminal
# View server logs
tail -f logs/messages.log
# Check running processes
jps -l
# Check port usage
netstat -an | grep 9080 # Linux/macOS
netstat -an | findstr 9080 # Windows