In genere con i file è meglio parlare in termini o di path assoluti (partendo da una posizione nota e in cui si è sicuri di poter leggere o scrivere) o di path relativi al percorso di esecuzione (che trovi tramite resource stream).
Nel momento in cui esegui un jar, il file verrà cercato all'interno del path corrente (quello da cui fai java -jar) e se non lo trova darà eccezione. Nel tuo caso non valorizza correttamente la stringa di cui tenti un substring è hai una indexofbound exception.
L'altra soluzione è fare in modo che il file in questione rientri nel build path di destinazione (in pratica del jar). Ricorda anche di specificare nel jar che stai facendo questo giro.
Infine ricorda che aggiungere questo file al jar crea problemi in quanto una sua modifica comporta la nuova creazione del jar, quindi l'opzione "leggi file con path assoluto" per me resta la migliore