Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright 2025 the original author or authors.
* <p>
* Licensed under the Moderne Source Available License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* https://docs.moderne.io/licensing/moderne-source-available-license
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openrewrite.java.migrate.jakarta;

import lombok.EqualsAndHashCode;
import lombok.Value;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.Option;
import org.openrewrite.Tree;
import org.openrewrite.TreeVisitor;
import org.openrewrite.gradle.marker.GradleDependencyConfiguration;
import org.openrewrite.gradle.marker.GradleProject;
import org.openrewrite.marker.SearchResult;
import org.openrewrite.maven.tree.MavenResolutionResult;

import java.util.Collection;
import java.util.List;

@Value
@EqualsAndHashCode(callSuper = false)
public class DoesNotHaveProvidedApiDependency extends Recipe {
String displayName = "Build does not declare a provided API dependency";

String description = "Find build files without an explicitly provided or compile-only API, " +
"so adding a compile dependency does not promote a container-provided API to runtime scope.";

@Option(displayName = "API coordinates",
description = "Legacy and Jakarta groupId:artifactId coordinates whose provided scope must be preserved.",
example = "javax.enterprise:cdi-api, jakarta.enterprise:jakarta.enterprise.cdi-api")
List<String> coordinates;

@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
return new TreeVisitor<Tree, ExecutionContext>() {
@Override
public Tree preVisit(Tree tree, ExecutionContext ctx) {
stopAfterPreVisit();
MavenResolutionResult maven = tree.getMarkers().findFirst(MavenResolutionResult.class).orElse(null);
if (maven != null && maven.getDependencies().values().stream().flatMap(Collection::stream)
.anyMatch(d -> d.getDepth() == 0 &&
"provided".equals(maven.getPom().getValue(d.getRequested().getScope())) &&
coordinates.contains(d.getGroupId() + ":" + d.getArtifactId()))) {
return tree;
}
GradleProject gradle = tree.getMarkers().findFirst(GradleProject.class).orElse(null);
if (gradle != null) {
GradleDependencyConfiguration compileOnly = gradle.getConfiguration("compileOnly");
if (compileOnly != null) {
for (String coordinate : coordinates) {
String[] ga = coordinate.split(":", 2);
if (ga.length == 2 && compileOnly.findRequestedDependency(ga[0], ga[1]) != null) {
return tree;
}
}
}
}
return SearchResult.found(tree);
}
};
}

}
147 changes: 111 additions & 36 deletions src/main/resources/META-INF/rewrite/jakarta-ee-9.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,7 @@ recipeList:
groupId: jakarta.annotation
artifactId: jakarta.annotation-api
newVersion: 2.0.x
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.annotation
artifactId: jakarta.annotation-api
version: 2.0.x
onlyIfUsing: javax.annotation..*
acceptTransitive: true
- org.openrewrite.java.migrate.jakarta.AddJakartaAnnotationDependency
- org.openrewrite.java.migrate.javax.AddApiDependencyForImports:
packageName: jakarta.annotation
groupId: jakarta.annotation
Expand Down Expand Up @@ -357,12 +352,7 @@ recipeList:
groupId: jakarta.enterprise
artifactId: jakarta.enterprise.cdi-api
newVersion: 3.0.x
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.enterprise
artifactId: jakarta.enterprise.cdi-api
version: 3.0.x
onlyIfUsing: javax.decorator..*
acceptTransitive: true
- org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency
- org.openrewrite.java.ChangePackage:
oldPackageName: javax.decorator
newPackageName: jakarta.decorator
Expand Down Expand Up @@ -403,12 +393,7 @@ recipeList:
groupId: jakarta.ejb
artifactId: jakarta.ejb-api
newVersion: 4.0.x
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.ejb
artifactId: jakarta.ejb-api
version: 4.0.x
onlyIfUsing: javax.ejb..*
acceptTransitive: true
- org.openrewrite.java.migrate.jakarta.AddJakartaEjbDependency
- org.openrewrite.maven.UpgradePluginVersion:
groupId: org.apache.maven.plugins
artifactId: maven-ejb-plugin
Expand Down Expand Up @@ -442,12 +427,7 @@ recipeList:
groupId: jakarta.el
artifactId: jakarta.el-api
newVersion: 4.0.x
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.el
artifactId: jakarta.el-api
version: 4.0.x
onlyIfUsing: javax.el..*
acceptTransitive: true
- org.openrewrite.java.migrate.jakarta.AddJakartaElDependency
- org.openrewrite.java.ChangePackage:
oldPackageName: javax.el
newPackageName: jakarta.el
Expand Down Expand Up @@ -510,12 +490,7 @@ recipeList:
groupId: jakarta.enterprise
artifactId: jakarta.enterprise.cdi-api
newVersion: 3.0.x
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.enterprise
artifactId: jakarta.enterprise.cdi-api
version: 3.0.x
onlyIfUsing: javax.enterprise..*
acceptTransitive: true
- org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency
- org.openrewrite.java.ChangePackage:
oldPackageName: javax.enterprise
newPackageName: jakarta.enterprise
Expand Down Expand Up @@ -752,12 +727,7 @@ recipeList:
groupId: jakarta.mail
artifactId: jakarta.mail-api
newVersion: 2.0.x
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.mail
artifactId: jakarta.mail-api
version: 2.0.x
onlyIfUsing: javax.mail.*
acceptTransitive: true
- org.openrewrite.java.migrate.jakarta.AddJakartaMailDependency
- org.openrewrite.java.ChangePackage:
oldPackageName: javax.mail
newPackageName: jakarta.mail
Expand Down Expand Up @@ -1782,3 +1752,108 @@ recipeList:
groupId: org.jboss.weld
artifactId: weld-core-impl
newVersion: 4.0.x

---
type: specs.openrewrite.org/v1beta/recipe
name: org.openrewrite.java.migrate.jakarta.AddJakartaCdiDependency
displayName: Add the Jakarta CDI API when needed
description: Add the Jakarta CDI API for migrated source without promoting an explicitly provided or compile-only API to a runtime dependency.
preconditions:
- org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency:
coordinates:
- javax.enterprise:cdi-api
- jakarta.enterprise:jakarta.enterprise.cdi-api
recipeList:
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.enterprise
artifactId: jakarta.enterprise.cdi-api
version: 3.0.x
onlyIfUsing: javax.enterprise..*
acceptTransitive: true
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.enterprise
artifactId: jakarta.enterprise.cdi-api
version: 3.0.x
onlyIfUsing: javax.decorator..*
acceptTransitive: true

---
type: specs.openrewrite.org/v1beta/recipe
name: org.openrewrite.java.migrate.jakarta.AddJakartaAnnotationDependency
displayName: Add the Jakarta Annotation API when needed
description: Add the migrated API without promoting an explicitly provided or compile-only dependency.
preconditions:
- org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency:
coordinates:
- javax.annotation:javax.annotation-api
- javax.annotation:jsr250-api
- org.glassfish.main:javax.annotation
- jakarta.annotation:jakarta.annotation-api
recipeList:
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.annotation
artifactId: jakarta.annotation-api
version: 2.0.x
onlyIfUsing: javax.annotation..*
acceptTransitive: true

---
type: specs.openrewrite.org/v1beta/recipe
name: org.openrewrite.java.migrate.jakarta.AddJakartaElDependency
displayName: Add the Jakarta El API when needed
description: Add the migrated API without promoting an explicitly provided or compile-only dependency.
preconditions:
- org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency:
coordinates:
- javax.el:javax.el-api
- javax.el:el-api
- jakarta.el:jakarta.el-api
recipeList:
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.el
artifactId: jakarta.el-api
version: 4.0.x
onlyIfUsing: javax.el..*
acceptTransitive: true

---
type: specs.openrewrite.org/v1beta/recipe
name: org.openrewrite.java.migrate.jakarta.AddJakartaEjbDependency
displayName: Add the Jakarta Ejb API when needed
description: Add the migrated API without promoting an explicitly provided or compile-only dependency.
preconditions:
- org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency:
coordinates:
- javax.ejb:javax.ejb-api
- javax.ejb:ejb-api
- org.glassfish.main:javax.ejb
- org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec
- jakarta.ejb:jakarta.ejb-api
recipeList:
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.ejb
artifactId: jakarta.ejb-api
version: 4.0.x
onlyIfUsing: javax.ejb..*
acceptTransitive: true

---
type: specs.openrewrite.org/v1beta/recipe
name: org.openrewrite.java.migrate.jakarta.AddJakartaMailDependency
displayName: Add the Jakarta Mail API when needed
description: Add the migrated API without promoting an explicitly provided or compile-only dependency.
preconditions:
- org.openrewrite.java.migrate.jakarta.DoesNotHaveProvidedApiDependency:
coordinates:
- com.sun.mail:javax.mail
- com.sun.mail:jakarta.mail
- javax.mail:mail
- javax.mail:javax.mail-api
- jakarta.mail:jakarta.mail-api
recipeList:
- org.openrewrite.java.dependencies.AddDependency:
groupId: jakarta.mail
artifactId: jakarta.mail-api
version: 2.0.x
onlyIfUsing: javax.mail.*
acceptTransitive: true
Loading