All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
3.10.0 - 2023-09-06
- Update compile-testing dependency from 0.18 to 0.21.0
- #514: Switch to slf4j-2.x and replace log4j with slf4j-simple
- #515: Improve class generation for testing
- #517: Update Gradle demo to pass plugin dependencies into Manifest
- #524: Keep the access modifier consistent
3.9.0 - 2023-01-30
- #512: Relax Plugin construction (remove dependency on PluginWrapper)
3.8.0 - 2022-10-27
- #492: Loading extensions crashes kotlin application
- #508: Not create extensions.idx if no extensions exist
- Make ServiceProviderExtensionFinder optional in demo (commented code)
- Add support for reading plugin descriptor from zip
- Use logger instead of System.out.println for demo
3.7.0 - 2022-06-28
- #435: Fix the path separator used in the SingletonExtensionFactoryTest.java
- #451: Fix Dependency version check fails even if required is '*'
- #490: Fix memory leak in SingletonExtensionFactory
- Update mockito version from 2.24.0 to 3.8.0
- #426: Update module-info.java
- #455: Do not rely on version from Manifest
- Update Log4j version to 2.17.1
- #430: Add a unit test in AbstractExtensionFinderTest to reproduce #428
- #450: Add wrapper to plugin manager (SecurePluginManagerWrapper)
- Add code analyses via Sonar
- Add support for reading plugin descriptor from zip
3.6.0 - 2021-01-16
- #394:
DependencyResolver
lost dependent info after plugin stop
- #415: Externalize some useful classes from testing
3.5.0 - 2020-11-08
- #395: Make ClassLoadingStrategy's constructor public
- #398: Make
DefaultPluginDescriptor#addDependency
usable - #402: Bucketed caching in
SingletonExtensionFactory
3.4.1 - 2020-08-14
- #371:
ClosedFileSystemException
when I run demo (Windows) - #391: Incorrect enum selection in
ClassLoadingStrategy.ADP
3.3.0 - 2020-04-21
- #355: Cannot remove plugin jar file after unloading
- #359: Calls to
File.mkdirs
in unzip logic may silently fail - #363: StackOverflow in
AbstractExtensionFinder.findExtensionAnnotation
- #366: Check proper list for debug logging
- #364: Failed plugin state added. When plugin failed to start previous state was kept
- #370: Improve annotation processor error messages
- #352: Add
equals
/hashCode
to some data classes - #365:
PluginClassLoader
does not resolve classpath resources from plugin dependencies
3.2.0 - 2019-11-29
- Fix flaky test
DefaultPluginRepositoryTest.testGetPluginArchive
- #349: Fix Gradle demo
- Add more defense in
ExtensionAnnotationProcessor
(error message if something is wrong) - Add more tests in
ExtensionAnnotationProcessorTest
- #348: Found extensions when using decorated annotations
- #350: Support any interface as an
ExtensionPoint
3.1.0 - 2019-09-08
- #335:
DefaultPluginStatusProvider.enablePlugin
function seems to be wrong
3.0.0 - 2019-06-12
- #297: Loading extensions may shutdown the application
- Fix the plugin directory will be deleted anyway in unzip
extract
method - #309: Can't delete/remove unloaded plugin
- #311: Wrong file delete on
JarPluginRepository.deletePluginPath
- #322: Fix
FileSystemException
in Windows on plugin delete
- Improve
run-demo
scripts - #294: Configure compound classes to use JAR plugins first
- #296: Return extension classes with wildcard type arguments
- #298: update ASM library to version 7.1
- Migrate to JUnit 5
- Improve
PluginZip
(used in tests) - Improve readability of
PropertiesPluginDescriptorFinderTest
- Convert
PluginException
inPluginRuntimeException
and use unchecked exceptions in PF4J
- #278: Make the project build on Java 11
- #287: Check no plugin with same
pluginId
is loaded - #288: Document thread safety of
PluginManager
s - #292: Communicate errors with Exceptions where appropriate
- #306: Provide an Archetype for new PF4J based projects
- #307: Add
JarPluginManager
andZipPluginManager
- Add constants for manifest's attributes names
- Add constants for properties names
- Add
PluginJar
(used in tests) - Add
AbstractPluginManagerTest
- Add
DirectedGraphTest
- Add
JarPluginManagerTest
- Extract constants for some system property names
- Remove deprecated constructor in
DefaultPluginManager
2.6.0 - 2019-02-01
- #273:
ServiceProviderExtensionFinder
should scan the whole classpath - #276: The plugins in the demo did not load successfully
- #277: Configures plugin manager to load "HowdyGreeting" using the services
- Improve run demo scripts
- #248: Load extensions from plugin libraries
- #271: Update
slf4j
dependency to version 1.7.25
- #265: Explicitly configure extension points for an extension
- #270: Optional plugin dependencies
- #275: Add automatic module name to
pf4j.jar
2.5.0 - 2018-12-12
- #248: Plugin upgrade version order not guaranteed
- #250: Method
DependencyResolver.resolve
removes dependents in check version block
- #209: Why "plugin.properties" is required?
2.4.0 - 2018-08-01
- #222: Correct the class passed to
DefaultPluginFactory's
logger - #223: A disabled plugin is automatically started by
pluginManager.startPlugins()
- #229: Can't find
plugin.properties
file inside.jar
- Fix error in
FileUtils.getFileSystem
- #229: Add
SingletonExtensionFactory
- #229: Allow a way to query all extension classes for a given plugin
2.3.0 - 2018-06-04
- #202: Spaces in name produce 'Illegal character in opaque part at index'
- #203: File lock on plugin jar not released
- #171: Change the copyright text from the head of files
- #218: It should not return null after it detects that the plugin has been loaded
- #219: Improve support for Gradle and Kotlin
- #199: Make optional the plugin class attribute of plugin manifest
- #206: Support multiple plugin directories
- Add aliases to the runtime modes (
dev
fordevelopment
andprod
fordeployment
)
2.2.0 - 2018-02-11
- #197: Close
JarFile
stream aftergetManifest
inManifestPluginDescriptorFinder.find(Path pluginPath)
- Before start a plugin check if the plugin is resolved
- #200: Compiling with Maven under Java9 breaks project
- #194: Changing packaging from ZIP to JAR for demo
- Improve
VersionManager
(prepare a newpf4j-update
release)
- #166: Simplify main
README
(move the content to http://www.pf4j.org) - #190: Add methods to just get extension classes
- Add
LoggingPluginStateListener
as listener inDefaultPluginManager
(only fordevelopment
mode) - Add new
RESOLVED
as plugin state - Add support for PARENT FIRST loading strategy
2.1.0 - 2018-01-10
- #177: Fix Gradle demo
- #178:
@Override
should not change method signature - #184: Bug in FileUtils while creating URI on Windows
- #180: Refactoring to make
PluginDescriptor
more usable
2.0.0 - 2017-10-17
- #156:
FileSystemException
when I calldeletePlugin
aftergetExtensions
- Fix Maven warnings
- #149: Updated gradle demo dependencies and switched from System.out.println to slf4j log
- Update some code to Java 7
- #168: Change root package from
ro.fortsoft.pf4j
toorg.pf4j
- Open a new extension (protected method) point in
PropertiesPluginDescriptorFinder
- #146: Kotlin plugin example added and README updated for Kotlin
- #150: Enforce dependencies versions
- #155: Add VersionManager abstractization (breaking change)
- #172: Add
CompoundPluginDescriptorFinder
- Add
CompoundPluginLoader
- Remove
JarPluginManager
(the logic is included inDefaultPluginManager
viaCompoundXYZ
concept)
1.3.0 - 2017-05-03
- #129: Properties Descriptor finder bug fixes and a test
- #131: Fix bug in
loadJars()
, did not add/lib
to classloader - #134:
getVersion()
use wrong class for calculating PF4J version - #135:
deletePlugin()
failed to delete plugin folder with contents - #137: The requires Expression does not print well
- #140: Unzip plugin zip file in
loadPluginFromPath()
- #130: Refactor validation of PluginDescriptors
- #138: Refactor of requires in PluginDescriptor (breaking change)
- #133: Support for adding license information to the plugins
- #136: Delete plugin zip on uninstall
- #139: Ability to get
pluginsRoot
from PluginManager - Add constructors with varargs in PluginException
1.2.0 - 2017-03-03
- #125: Fix possible NPE
- #116: Updated PF4J to newest version in Gradle demo
- Reactivate protection against the issues similar with #97
- #128: Add
JarPluginManager
,PluginLoader
,AbstractPluginManager
1.1.1 - 2016-11-17
- #116: Default/System extensions are duplicated
- #111: Add inheritance support on Extension annotation
1.1.0 - 2016-08-22
- #107: PluginDescriptor can't be extended
- #108: Return a list of all extensions from a plugin and optional for an extension point
1.0.0 - 2016-07-07
- #99: NPE in
DefaultPluginManager.stopPlugin()
- #100: Gradle build in demo_gradle is broken
- #103: Gradle demos don't build zip with libs
- Fix logging issue in demo
- Rework defense against #97
- Eliminate duplicate log messages from demo
- Improve debugging for "no extensions found"
0.13.1 - 2016-04-01
- #98: WARN ro.fortsoft.pf4j.AbstractExtensionFinder (too many log lines)
0.13.0 - 2016-03-28
- Fix issue with listing files from the jar file in
readPluginsStorages()
- #89: Fix "URI is not hierarchical" issue
- #91: Using project lombok with pf4j causes javax.annotation.processing.FilerException
- Log with trace level on PluginClassLoader
- Add
distributionManagement
section inpom.xml
- Add defense to #97
- Add helper
DefaultExtensionFinder.addServiceProviderExtensionFinder()
- Disable
ServiceProviderExtensionFinder
fromDefaultExtensionFinder
0.12.0 - 2016-01-29
- #83:
stopPlugin()
throws NPE for dependents check - In development mode hide
plugins/target
folder (it' is not a plugin)
- Add constructor with vararg and make
addFileFilter()
fluent inAndFileFilter
- #84: remove warn from
DefaultPluginManager.whichPlugin()
- Pull method
DefaultPluginManager.whichPlugin()
to PluginManager - Add
getExtensionFactory()
in PluginManager interface
- Add constructor with vararg and make addFileFilter method fluent in
AndFileFilter
- Add
NameFileFilter
andOrFileFilter
- #85: ExtensionStorage based on Java Service Provider (META-INf/services)
0.11.0 - 2015-11-19
- #78:
PluginManager.disablePlugin()
throws UnsupportedOperationExeption
- Make more fields protected in DefaultPluginManager
- #70: Improve PluginDescriptorFinder implementations
- Make PluginManager available in Plugin via PluginWrapper
- #66: Add possibility to overwrite DefaultPluginManager (to create a JarPluginManager)
- Added one more fail test to DefaultPluginFactory
- Added one more fail test to DefaultExtensionFactory
- Added ManifestPluginDescriptorFinder tests
0.10.0 - 2015-08-11
- #39: Fix build on JDK 1.8
- [42]: Stop Plugin issue
- [60]: Failed tests