Je travaille sur un produit à source fermée appelé Ekwos. C'est un logiciel pour gérer les compétitions équestres. Le modèle de licence pour ce logiciel doit être renouvelé chaque année. Pour cette raison, je voulais ajouter un module de licence de base pour contrôler qui peut utiliser le logiciel et pour combien de temps.
Après quelques recherches, j'ai trouvé cet article http://blog.afewguyscoding.com/2012/02/licensing-module-java/ qui fournit ce que je veux mais j'ai eu du mal à adapter le code source pour mon usage. Après quelques heures, j'ai remanié le code source original pour le rendre plus flexible et répondre à mes besoins. Le module est complètement indépendant de tout module externe.
Le code est publié sous licence MIT, BSD et Apache.
Voici un extrait montrant comment l'utiliser dans votre application. Ce snippet utilise SWT pour afficher le message d'erreur. Votre application peut utiliser ce que vous voulez à la place de SWT.
protected boolean checkLicense() {
// Open the license manager
LicenseManager licenseManager;
try {
URL resource = getClass().getResource("pubkey.der");
InputStream stream = resource.openStream();
try {
licenseManager = new LicenseManager(stream, null);
} finally {
stream.close();
}
} catch (Exception e) {
MessageUtils.openWarning(null, "The installation is broken. Please re-install.", e);
return false;
}
// Open the license file
File licenseFile = new File(LICENSE_FILE);
if(!licenseFile.exists()){
licenseFile = new File(TRIAL_LICENSE_FILE);
}
try {
App.license = (EkwosLicense) licenseManager
.readLicenseFile(licenseFile);
} catch (InvalidKeyException e) {
MessageUtils.openWarning(null,
"Your licence is invalid or corrupted.", e);
return false;
} catch (NoSuchAlgorithmException e) {
// Should never happen
MessageUtils.openWarning(null, "The installation is broken. Please re-install.", e);
return false;
} catch (SignatureException e) {
MessageUtils.openInfo(null, "The installation is broken. Please re-install.");
return false;
} catch (FileNotFoundException e) {
MessageUtils.openWarning(null,
"Cannot find your licence file.", e);
return false;
} catch (IOException e) {
MessageUtils.openWarning(null, "Cannot read your licence file.",
e);
return false;
} catch (ClassNotFoundException e) {
MessageUtils.openWarning(null,
"Your licence is corrupted.", e);
return false;
}
// Validate the license data
String currentVersion = getCurrentVersion();
try {
license.validate(new Date(), currentVersion);
} catch (LicenseExpiredException e) {
if (license.getExpiration() != null) {
String date = DateFormat.getDateInstance().format(
license.getExpiration());
MessageUtils.openWarning(null,
"Your licence is expired since:" + date);
} else {
MessageUtils.openWarning(null, "Your licence is invalid.");
}
return false;
} catch (LicenseException e) {
MessageUtils.openWarning(null, "Your licence is invalid.", e);
return false;
}
return true;
}
Vous pouvez obtenir le code source complet à partir de Gitlab. Des jars sont également fournis.