#java
#java — язык #java
Вопрос:
Я использую устройство отпечатков пальцев для регистрации отпечатков пальцев в моей базе данных MySQL. Однако я не могу правильно запустить свою программу, поскольку при ее выполнении отображается ошибка.
Я провел некоторое исследование по этому вопросу. На многих форумах сообщается, что это проблема с версией JRE, поэтому я безуспешно пробовал JRE 9, 10 и 11.
Ошибка произошла во время инициализации загрузочного уровня java.lang.module.ResolutionException: Модуль dpfpenrollment содержит пакет com.digitalpersona.onetouch.ui.swing, модуль dpfpverification экспортирует пакет com.digitalpersona.onetouch.ui.swing в dpfpenrollment
Фактический результат должен зарегистрировать идентификатор, имя пользователя, отпечаток пальца в MySQL.
Это код, который создает экземпляры UserInterface
и UserDatabase
и выполняется UserInterface
.
package com.my.apiit;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Creates UserInterface and UserDatabase instances and runs UserInterface.
*/
public class AppFingerPrintToDb {
public static void main (String[] args) {
try {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new ConsoleUserDbManager());
exec.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.my.apiit;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
import java.util.concurrent.LinkedBlockingQueue;
import com.digitalpersona.onetouch.DPFPDataPurpose;
import com.digitalpersona.onetouch.DPFPFeatureSet;
import com.digitalpersona.onetouch.DPFPFingerIndex;
import com.digitalpersona.onetouch.DPFPGlobal;
import com.digitalpersona.onetouch.DPFPSample;
import com.digitalpersona.onetouch.DPFPTemplate;
import com.digitalpersona.onetouch.capture.DPFPCapture;
import com.digitalpersona.onetouch.capture.DPFPCapturePriority;
import com.digitalpersona.onetouch.capture.event.DPFPDataEvent;
import com.digitalpersona.onetouch.capture.event.DPFPDataListener;
import com.digitalpersona.onetouch.capture.event.DPFPReaderStatusAdapter;
import com.digitalpersona.onetouch.capture.event.DPFPReaderStatusEvent;
import com.digitalpersona.onetouch.processing.DPFPEnrollment;
import com.digitalpersona.onetouch.processing.DPFPFeatureExtraction;
import com.digitalpersona.onetouch.processing.DPFPImageQualityException;
import com.digitalpersona.onetouch.readers.DPFPReadersCollection;
import com.digitalpersona.onetouch.verification.DPFPVerification;
import com.digitalpersona.onetouch.verification.DPFPVerificationResu<
/**
* Implementation of UserInterface.Factory interface that creates a console-based user interface
*/
public class ConsoleUserDbManager implements Runnable {
public void run() {
System.out.println("n*** Console UI ***");
String activeReader = null;
boolean readerSelected = false;
activeReader = selectReader(activeReader);
readerSelected = true;
int res;
while ((res = MenuShow(mainMenu, MENU_WITH_EXIT)) != exitItem.getValue()) try {
switch (res) {
/*case MAIN_MENU_ADD:
//addUser();
break;*/
case MAIN_MENU_ENROLL:
addUser(activeReader);
break;
case MAIN_MENU_VERIFY:
verify(activeReader);
break;
}
} catch (Exception e) { }
}
/**
* Console menu item
*/
private static class MenuItem {
private String text;
private int value;
/**
* Creates a menu item
*
* @param text item text
* @param value value to return if item is chosen
*/
public MenuItem(String text, int value) {
this.text = text;
this.value = value;
}
/**
* Returns the menu item's text
*
* @return menu item text
*/
public String getText() {
return text;
}
/**
* Returns the menu item's associated value
*
* @return associated value
*/
public int getValue() {
return value;
}
}
/**
* Specifies that menu should be appended with "Back" item
*/
private static final int MENU_WITH_BACK = 2;
/**
* Specifies that menu should be appended with "Exit" item
*/
private static final int MENU_WITH_EXIT = 1;
/**
* "Exit" menu item
*/
private static final MenuItem exitItem = new MenuItem("Exit the application", -1);
/**
* "Back" menu item
*/
private static final MenuItem backItem = new MenuItem("Return to the previous menu", -2);
private static final int MAIN_MENU_ENROLL = 102;
private static final int MAIN_MENU_VERIFY = 103;
private static final Vector<MenuItem> mainMenu;
static {
mainMenu = new Vector<MenuItem>();
mainMenu.add(new MenuItem("Add User And Perform fingerprint enrollment", MAIN_MENU_ENROLL));
mainMenu.add(new MenuItem("Perform fingerprint verification", MAIN_MENU_VERIFY));
}
private int MenuShow(Vector<MenuItem> menu, int nMenuFlags) {
int choice = 0;
if (menu == null)
return choice;
while (true) {
System.out.println();
for (int i = 0; i < menu.size(); i)
System.out.printf("%d: %sn", i 1, menu.elementAt(i).getText());
StringBuilder sb = new StringBuilder();
sb.append(String.format("Choose an option (1 - %d", menu.size()));
if ((nMenuFlags amp; MENU_WITH_BACK) != 0) {
System.out.printf("nR: %snn", backItem.getText());
sb.append(", R");
}
if ((nMenuFlags amp; MENU_WITH_EXIT) != 0) {
System.out.printf("nE: %snn", exitItem.getText());
sb.append(", E");
}
sb.append("): ");
String userInput = ShowDialog(sb.toString());
if ((nMenuFlags amp; MENU_WITH_EXIT) != 0 amp;amp; userInput.equalsIgnoreCase("E")) {
choice = exitItem.getValue();
break;
}
if ((nMenuFlags amp; MENU_WITH_BACK) != 0 amp;amp; userInput.equalsIgnoreCase("R")) {
choice = backItem.getValue();
break;
}
int nInput;
try {
nInput = Integer.parseInt(userInput);
} catch (NumberFormatException e) {
System.out.printf("nInvalid input: "%s"n", userInput);
continue;
}
if (nInput < 1 || nInput > menu.size()) {
System.out.printf("nIncorrect choice: "%s"n", userInput);
continue;
}
choice = menu.elementAt(nInput - 1).getValue();
break;
}
System.out.println();
return choice;
}
/**
* Adds user to the database
*/
private void addUser(String activeReader) {
System.out.printf("Adding person to the database…n");
String username = ShowDialog("Enter a name: ");
register(activeReader,username);
/*if (username != null) {
System.out.printf(""%s" was added to the database.n", username);
} else {
System.out.printf(""%s" was not added to the database.n", username);
}*/
}
/**
* register() looks for the user in the database, invokes CreateRegistrationTemplate(),
* and stores the template in the database.
*
* @param activeReader reader to use for fingerprint acquisition
*/
private void register(String activeReader, String username) {
UserDAO userDAO = UserDAO.getInstance();
UserDb userDb = userDAO.selectUser(username);
if (userDb != null) {
System.err.println("User already exist…");
return;
}
System.out.printf("Performing fingerprint enrollment…n");
try {
DPFPFingerIndex finger = DPFPFingerIndex.values()[1];
DPFPFeatureExtraction featureExtractor = DPFPGlobal.getFeatureExtractionFactory().createFeatureExtraction();
DPFPEnrollment enrollment = DPFPGlobal.getEnrollmentFactory().createEnrollment();
while (enrollment.getFeaturesNeeded() > 0) {
DPFPSample sample = getSample(activeReader,
String.format("Scan your finger (%d remaining)n", enrollment.getFeaturesNeeded()));
if (sample == null)
continue;
DPFPFeatureSet featureSet;
try {
featureSet = featureExtractor.createFeatureSet(sample, DPFPDataPurpose.DATA_PURPOSE_ENROLLMENT);
} catch (DPFPImageQualityException e) {
System.out.printf("Bad image quality: "%s". Try again. n", e.getCaptureFeedback().toString());
continue;
}
enrollment.addFeatures(featureSet);
}
DPFPTemplate template = enrollment.getTemplate();
// Write to database
userDb = new UserDb();
userDb.setUserName(username);
userDb.setFingerPrint(template.serialize());
userDAO.insertUser(userDb.getUserName(), userDb.fingerPrint);
//-- write to a specific file
/*FileOutputStream stream;
try {
stream = new FileOutputStream(new File("d:/fingerPrint/sample.fpt"));
stream.write(template.serialize());
stream.close();
} catch (Exception e) {
e.printStackTrace();
}*/
System.err.println("Congratulation your fingerprint is enrolled in database..");
} catch (UserDbException e){
System.out.printf(e.getMessage() "n");
} catch (DPFPImageQualityException e) {
System.out.printf("Failed to enroll the finger.n");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
/**
* Acquires fingerprint from the sensor and matches it with the registration templates
* stored in the database.
*
* @param activeReader fingerprint reader to use
*/
private void verify(String activeReader) {
System.out.printf("Performing fingerprint verification…n");
String userName = ShowDialog("Enter the name of the person to be verified: ");
UserDAO userDAO = UserDAO.getInstance();
UserDb user =userDAO.selectUser(userName);
if (user == null) {
System.out.printf(""%s" was not found in the database.n", userName);
} else {
if (user == null) {
System.out.printf("No fingers for "%s" have been enrolled.n", userName);
} else {
try {
DPFPSample sample = getSample(activeReader, "Scan your fingern");
if (sample == null)
throw new Exception();
DPFPFeatureExtraction featureExtractor = DPFPGlobal.getFeatureExtractionFactory().createFeatureExtraction();
DPFPFeatureSet featureSet = featureExtractor.createFeatureSet(sample, DPFPDataPurpose.DATA_PURPOSE_VERIFICATION);
DPFPVerification matcher = DPFPGlobal.getVerificationFactory().createVerification();
matcher.setFARRequested(DPFPVerification.MEDIUM_SECURITY_FAR);
try {
//-- reading from User
byte[] data = user.getFingerPrint();
DPFPTemplate t = DPFPGlobal.getTemplateFactory().createTemplate();
t.deserialize(data);
//--- reading from file
/*FileInputStream stream = new FileInputStream("d:/fingerPrint/sample.fpt");
byte[] data = new byte[stream.available()];
stream.read(data);
stream.close();
DPFPTemplate t = DPFPGlobal.getTemplateFactory().createTemplate();
t.deserialize(data);
*/
//setTemplate(t);
//-----verfiy -------------
if (t != null) {
DPFPVerificationResult result = matcher.verify(featureSet, t);
if (result.isVerified()) {
//System.err.println("Matching finger: Successfully Matched" ,(double)result.getFalseAcceptRate()/DPFPVerification.PROBABILITY_ONE);
System.err.println("Matching finger: Successfully Matched");
ShowDialog("nPress enter to continue ....");
return;
}
}
} catch (Exception ex) {
System.out.printf("Failed to perform verification.");
}
} catch (Exception e) {
System.out.printf("Failed to perform verification.");
}
//System.out.printf("No matching fingers for "%s" were found.n", userName);
System.out.printf("No matching fingers for " userName " were found.n");
ShowDialog("nPress enter to continue…");
}
}
}
/**
* selectReader() stores chosen reader in *pActiveReader
* @param activeReader currently selected reader
* @return reader selected
* @throws IndexOutOfBoundsException if no reader available
*/
String selectReader(String activeReader) throws IndexOutOfBoundsException {
DPFPReadersCollection readers = DPFPGlobal.getReadersFactory().getReaders();
if (readers == null || readers.size() == 0)
throw new IndexOutOfBoundsException("There are no readers available");
int res = 0;
return readers.get(res).getSerialNumber();
}
/**
* Acquires a fingerprint sample from the specified fingerprint reader
*
* @param activeReader Fingerprint reader to use for acquisition
* @return sample acquired
* @throws InterruptedException if thread is interrupted
*/
private DPFPSample getSample(String activeReader, String prompt)
throws InterruptedException {
final LinkedBlockingQueue<DPFPSample> samples = new LinkedBlockingQueue<DPFPSample>();
DPFPCapture capture = DPFPGlobal.getCaptureFactory().createCapture();
capture.setReaderSerialNumber(activeReader);
capture.setPriority(DPFPCapturePriority.CAPTURE_PRIORITY_LOW);
capture.addDataListener(new DPFPDataListener() {
public void dataAcquired(DPFPDataEvent e) {
if (e != null amp;amp; e.getSample() != null) {
try {
samples.put(e.getSample());
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
});
capture.addReaderStatusListener(new DPFPReaderStatusAdapter() {
int lastStatus = DPFPReaderStatusEvent.READER_CONNECTED;
public void readerConnected(DPFPReaderStatusEvent e) {
if (lastStatus != e.getReaderStatus())
System.out.println("Reader is connected");
lastStatus = e.getReaderStatus();
}
public void readerDisconnected(DPFPReaderStatusEvent e) {
if (lastStatus != e.getReaderStatus())
System.out.println("Reader is disconnected");
lastStatus = e.getReaderStatus();
}
});
try {
capture.startCapture();
System.out.print(prompt);
return samples.take();
} catch (RuntimeException e) {
System.out.printf("Failed to start capture. Check that reader is not used by another application.n");
throw e;
} finally {
capture.stopCapture();
}
}
private String ShowDialog(String prompt) {
System.out.printf(prompt);
try {
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
return stdin.readLine();
} catch (IOException e) {
return "";
}
}
}
Комментарии:
1. Пожалуйста, поделитесь своим файлом конфигурации maven или gradle.
2. хм, могу я спросить, что такое конфигурационный файл maven или gradle?
3. файл maven находится по адресу . m2? Я не могу найти файл, но я вижу его в настройках пакета STS
4. Извините, я предположил, что вы это используете. Maven (файл.pom) и gradle являются инструментами управления проектами. Можете ли вы тогда поделиться своим кодом?
5. я включил это в ответ, потому что комментарий не подходит к коду