diff --git a/rewrite-java/src/main/java/org/openrewrite/java/ChangePackage.java b/rewrite-java/src/main/java/org/openrewrite/java/ChangePackage.java index dd32bea75a..0050870eaf 100644 --- a/rewrite-java/src/main/java/org/openrewrite/java/ChangePackage.java +++ b/rewrite-java/src/main/java/org/openrewrite/java/ChangePackage.java @@ -259,10 +259,22 @@ public J postVisit(J tree, ExecutionContext ctx) { String path = ((SourceFile) sf).getSourcePath().toString().replace('\\', '/'); String changingFrom = getCursor().getMessage(RENAME_FROM_KEY); assert changingFrom != null; - sf = ((SourceFile) sf).withSourcePath(Paths.get(path.replaceFirst( - changingFrom.replace('.', '/'), - changingTo.replace('.', '/') - ))); + final String oldPathPart = changingFrom.replace('.', '/'); + final String newPathPart = changingTo.replace('.', '/'); + final String newPath; + if (path.startsWith(oldPathPart)) { + newPath = newPathPart + path.substring(oldPathPart.length()); + } else { + final int dirIdx = path.indexOf('/'); + final String prefix = dirIdx == -1 ? null : path.substring(0, dirIdx); + final String pathNoPrefix = dirIdx == -1 ? path : path.substring(dirIdx); + final String newPath1 = pathNoPrefix.replaceFirst( + oldPathPart, + newPathPart + ); + newPath = prefix == null ? newPath1 : prefix + newPath1; + } + sf = ((SourceFile) sf).withSourcePath(Paths.get(newPath)); for (J.Import anImport : sf.getImports()) { if (anImport.getPackageName().equals(changingTo) && !anImport.isStatic()) {