Skip to main content

Common Issues

Missing Required Properties

Symptom: MCReleaser exits immediately without uploading Error Message:
ERROR: The following keys are missing: name, version, description
Cause: Required properties are not set in environment variables or system properties. Solution:
  1. Ensure all required properties are set:
export NAME="My Mod"
export VERSION="1.0.0"
export DESCRIPTION="Release description"
export FILES="build/libs/*.jar"
  1. Or use system properties:
java -Dname="My Mod" \
     -Dversion="1.0.0" \
     -Ddescription="Release description" \
     -Dfiles="build/libs/*.jar" \
     -jar mcreleaser.jar
  1. Enable missing key announcements to see what’s missing:
export ANNOUNCE_MISSING_KEY=true
java -jar mcreleaser.jar
Required properties: name, version, description, files

No Platform Found

Symptom: Runtime exception Error Message:
java.lang.RuntimeException: No platform found
Cause:
  • platforms property is empty or invalid
  • Platform-specific required properties are missing
  • Platform names are misspelled
Solution:
  1. Check platform names (must be lowercase):
# Valid platforms
export PLATFORMS="github,modrinth,curseforge,hangar,polymart"

# Or use all platforms
export PLATFORMS="all"
  1. Verify platform-specific properties are set:
Modrinth:
export MODRINTH_TOKEN="mrp_xxxxx"
export MODRINTH_PROJECT="my-mod"
GitHub:
export GITHUB_TOKEN="ghp_xxxxx"
export GITHUB_REPOSITORY="owner/repo"
CurseForge:
export CURSEFORGE_TOKEN="xxxxx"
export CURSEFORGE_PROJECT="123456"
Hangar:
export HANGAR_TOKEN="xxxxx"
export HANGAR_PROJECT="owner/project"
Polymart:
export POLYMART_TOKEN="xxxxx"
export POLYMART_PROJECT="12345"

File Globs Not Found

Symptom: Validation error Error Message:
java.lang.IllegalStateException: File globs not found
Cause: The files property is not set. Solution:
export FILES="build/libs/*.jar"
# Or multiple patterns
export FILES="build/libs/*.jar build/libs/*-sources.jar"
Use space-separated glob patterns to match multiple files. Globs are resolved relative to the current working directory.

Authentication Failures

Symptom: HTTP 401 or 403 errors Error Message (varies by platform):
Unauthorized: Invalid token
Forbidden: Insufficient permissions
Cause: Invalid or expired authentication tokens Solution:
  1. Verify token format:
  • Modrinth: Tokens start with mrp_
  • GitHub: Personal access tokens start with ghp_, fine-grained tokens start with github_pat_
  • CurseForge: API key from CurseForge console
  • Hangar: API key from Hangar settings
  • Polymart: API key from Polymart account
  1. Check token permissions:
  • GitHub: Requires repo scope (or contents: write for fine-grained)
  • Modrinth: Requires PROJECT_WRITE scope
  • CurseForge: Requires project upload permissions
  1. Regenerate tokens if expired or compromised
  2. Verify environment variables are set correctly:
# Check token is set (without revealing value)
echo ${MODRINTH_TOKEN:0:4}...  # Should show 'mrp_'
echo ${GITHUB_TOKEN:0:4}...    # Should show 'ghp_' or 'gith'
Never commit tokens to version control. Use environment variables or CI/CD secrets.

Invalid Project ID

Symptom: HTTP 404 or project not found error Cause: Incorrect project identifier for the platform Solution:
  1. Modrinth: Use project slug or ID
# Slug (from project URL)
export MODRINTH_PROJECT="my-mod"  # From modrinth.com/mod/my-mod

# Or project ID
export MODRINTH_PROJECT="AABBCCDD"
  1. GitHub: Use owner/repository format
export GITHUB_REPOSITORY="username/repo-name"
  1. CurseForge: Use numeric project ID
# From project URL: curseforge.com/minecraft/mc-mods/my-mod/files
# Look for project ID in API or project settings
export CURSEFORGE_PROJECT="123456"
  1. Hangar: Use owner/project format
export HANGAR_PROJECT="username/project-name"
  1. Polymart: Use numeric resource ID
export POLYMART_PROJECT="12345"

Game Version Errors

Symptom: Upload rejected due to invalid game versions Error Message:
Invalid game version: 1.20.5
Game version not supported by platform
Cause:
  • Game version format incorrect
  • Game version not yet available on platform
  • Version type filter too restrictive
Solution:
  1. Use correct format (comma or space-separated):
export GAME_VERSIONS="1.20.1,1.20.2,1.20.4"
# Or space-separated
export GAME_VERSIONS="1.20.1 1.20.2 1.20.4"
  1. Use version type filter to auto-fetch versions:
export GAME_VERSION_TYPE="release"  # Only release versions
export GAME_VERSION_TYPE="snapshot" # Only snapshots
export GAME_VERSION_TYPE="all"      # All versions
  1. Override per platform:
# Global versions
export GAME_VERSIONS="1.20.1,1.20.2"

# Platform-specific override
export MODRINTH_GAME_VERSIONS="1.20.1,1.20.2,1.20.4"
export CURSEFORGE_GAME_VERSIONS="1.20.1,1.20.2"
  1. Check platform availability: Some platforms may not have newer versions available immediately after Minecraft releases.
Platform-specific gameVersions properties override the global GAME_VERSIONS property.

Network Timeouts

Symptom: Upload hangs or times out Error Message:
java.net.SocketTimeoutException: Read timed out
Connection timeout
Cause:
  • Large file uploads on slow connections
  • Multiple parallel uploads overwhelming network
  • Platform API slowness
Solution:
  1. Use synchronous mode to upload sequentially:
export SYNC=true
java -jar mcreleaser.jar
  1. Reduce number of platforms:
# Instead of "all"
export PLATFORMS="modrinth,curseforge"
  1. Check network connectivity:
# Test platform API endpoints
curl -I https://api.modrinth.com/v2
curl -I https://api.github.com
  1. Increase Java timeout (if using custom HTTP client):
java -Dhttp.timeout=300000 -jar mcreleaser.jar  # 5 minutes

Partial Upload Success

Symptom: Some platforms succeed, others fail in async mode Cause: Asynchronous mode continues uploading to all platforms even if one fails Solution:
  1. Check logs to identify which platform failed
  2. Use synchronous mode for clearer error tracking:
export SYNC=true
java -jar mcreleaser.jar
  1. Upload to single platform to isolate issue:
export PLATFORMS="modrinth"
java -jar mcreleaser.jar
  1. Re-run for failed platforms only:
# First run uploaded to github and modrinth
# Second run targets only the failed platform
export PLATFORMS="curseforge"
java -jar mcreleaser.jar
In async mode, successful uploads are not rolled back if others fail. You may need to manually delete or hide failed releases.

Property Name Confusion

Symptom: Property not being read despite being set Cause: Incorrect property name casing or format Solution:
  1. Use correct casing:
# Environment variables: CONSTANT_CASE
export MODRINTH_TOKEN="mrp_xxxxx"      # Correct
export modrinth_token="mrp_xxxxx"      # Wrong

# System properties: camelCase
java -DmodrinthToken="mrp_xxxxx"       # Correct
java -Dmodrinth-token="mrp_xxxxx"      # Wrong
  1. Verify conversion:
Property (camelCase)Environment (CONSTANT_CASE)
modrinthTokenMODRINTH_TOKEN
gameVersionTypeGAME_VERSION_TYPE
githubRepositoryGITHUB_REPOSITORY
  1. Check priority: Environment variables override system properties
# This sets VERSION to "2.0.0" (env var wins)
export VERSION="2.0.0"
java -Dversion="1.0.0" -jar mcreleaser.jar

Dependency Format Errors

Symptom: Modrinth upload fails due to invalid dependencies Error Message:
Invalid dependency format
Cause: Incorrect dependency syntax Solution: Use correct Modrinth dependency format:
# Format: project-id:type
# Types: required, optional, incompatible, embedded
export MODRINTH_DEPENDENCIES="fabric-api:required,sodium:optional"

# Multiple dependencies (comma-separated)
export MODRINTH_DEPENDENCIES="fabric-api:required,fabric-kotlin:required,sodium:optional"

File Not Found

Symptom: Upload fails because files don’t exist Error Message:
No files found matching glob pattern
Cause:
  • Incorrect glob pattern
  • Files not built yet
  • Wrong working directory
Solution:
  1. Verify files exist:
ls -la build/libs/*.jar
  1. Check working directory:
pwd  # Should be project root
cd /path/to/project
java -jar mcreleaser.jar
  1. Use correct glob pattern:
# Correct
export FILES="build/libs/*.jar"

# Exclude sources/javadoc
export FILES="build/libs/*[!-sources][!-javadoc].jar"

# Multiple patterns
export FILES="build/libs/*.jar *.zip"
  1. Build before uploading:
# Gradle
./gradlew build
java -jar mcreleaser.jar

# Maven
mvn package
java -jar mcreleaser.jar

Debugging Tips

Enable Verbose Logging

MCReleaser uses SLF4J. Configure logging in logback.xml or via system properties:
java -Dorg.slf4j.simpleLogger.defaultLogLevel=debug -jar mcreleaser.jar

Check Property Values

Verify all properties are set correctly:
# Enable missing key announcements
export ANNOUNCE_MISSING_KEY=true
java -jar mcreleaser.jar

Test Single Platform

Isolate issues by testing one platform at a time:
export PLATFORMS="modrinth"
java -jar mcreleaser.jar

Use Synchronous Mode

Easier to debug with sequential execution:
export SYNC=true
java -jar mcreleaser.jar

Validate Tokens

Test API tokens independently:
# Modrinth
curl -H "Authorization: ${MODRINTH_TOKEN}" \
     https://api.modrinth.com/v2/user

# GitHub
curl -H "Authorization: token ${GITHUB_TOKEN}" \
     https://api.github.com/user

Check API Status

Verify platform APIs are operational:

Getting Help

If you’re still experiencing issues:
  1. Check existing issues: Search the GitHub repository for similar problems
  2. Gather information:
    • MCReleaser version
    • Java version (java -version)
    • Full command or configuration
    • Complete error message and stack trace
    • Platform(s) affected
  3. Create a minimal reproduction: Simplify to smallest failing case
  4. Redact sensitive information: Remove tokens, project IDs, and other secrets
  5. Open an issue: Provide all gathered information
Never include authentication tokens, API keys, or other secrets when requesting help publicly.

Best Practices to Avoid Issues

  1. Use environment variables for secrets: Prevents accidental exposure
  2. Enable missing key announcements during development: Catch configuration errors early
  3. Test with single platform first: Verify configuration before multi-platform upload
  4. Use version control for configuration: Track changes to .env files (exclude secrets)
  5. Validate tokens regularly: Check expiration and permissions
  6. Document your configuration: Maintain .env.example with required properties
  7. Use CI/CD secrets management: Never hardcode tokens in scripts
  8. Test in synchronous mode first: Easier debugging before switching to async
Create a test project on each platform for dry-run testing without affecting production releases.

Build docs developers (and LLMs) love