@magicr You will need to have Admin access to navigate to CRX package manager.
Step by step instructions for perform delete operation programmatically:
Decide lookup method
- By packageId (group:name:version) or by repository path (/etc/packages or /var/packages).
Create a Sling service user and mapping
- Felix config: my.bundle.symbolic.name:package-delete-service = package-delete-user
- Grant minimal permissions on package paths.
Build an OSGi service interface (PackageDeletionService) and implementation.
- Inject ResourceResolverFactory.
Acquire a secure ResourceResolver and JCR Session
- Use ResourceResolverFactory.getServiceResourceResolver with SUBSERVICE.
- Always close the resolver (try-with-resources).
Preferred deletion: use Packaging API
- Use org.apache.jackrabbit.vault.packaging (or com.day.cq.packaging) PackageManager / JcrPackage to locate and remove the package.
- It handles metadata and registry cleanup.
Fallback: remove JCR nodes directly
- Validate node exists and check installed state (prevent accidental delete).
- session.getNode(path).remove(); session.save().
Safety and checks
- Require a force boolean to delete installed packages.
- Validate path prefixes (/etc/packages or /var/packages).
- Log/audit each delete.
Error handling and cleanup
- Catch RepositoryException, LoginException, IOExceptions.
- Return clear errors and ensure resourceResolver.close().
Test and deploy
- Unit tests (mock resolver/packaging).
- Integration tests in non‑prod: create → install → delete (with/without force).
- Deploy bundle and configure subservice mapping.
Minimal example (conceptual):
Map<String,Object> auth = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, "package-delete-service"); try (ResourceResolver rr = resolverFactory.getServiceResourceResolver(auth)) { Session session = rr.adaptTo(Session.class); // Preferred: use PackageManager to open/delete package if (session.nodeExists(pkgPath)) { session.getNode(pkgPath).remove(); session.save(); } }