Не удается заставить biojava работать в приложении Maven Netbeans
У меня проблема с тем, чтобы BioJava работал в приложении Netbeans RCP, созданном с использованием Maven. Я создал модуль Maven в качестве оболочки, включая пакеты org.biojava.* И org.forester.* Как общедоступные в POM. Затем из другого модуля я установил обертку как зависимость и использую некоторые базовые примеры из кулинарной книги BioJava для тестирования.
Всякий раз, когда я пытаюсь создать экземпляр объекта класса из BioJava, приложение зависает, и мне приходится убивать его с помощью диспетчера задач Windows.
Вот файл pom оболочки:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>nl.hecklab.bioinformatics</groupId>
<artifactId>Spider-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>BiojavaWrapper</artifactId>
<version>4.1.0</version>
<packaging>nbm</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<useOSGiDependencies>true</useOSGiDependencies>
<publicPackages>
<publicPackage>org.biojava.*</publicPackage>
<publicPackage>org.forester.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.biojava</groupId>
<artifactId>biojava-alignment</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Вот код, который я пытаюсь заставить работать. Это просто очень грубый пример, вызываемый кнопкой TopComponent. Ввод и вывод - это просто текстовые поля.
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Reader r = new Reader(new File("D:\\current\\fastafile.fasta"));
for (ProteinSequence a : r.getSequences()) {
input.append(a.toString());
}
Profile<ProteinSequence, AminoAcidCompound> profile = Alignments.getMultipleSequenceAlignment(r.sequences);
output.setText(String.format("Clustalw:%n%s%n", profile));
ConcurrencyTools.shutdown();
}
Вот класс читателя:
public class Reader {
List<ProteinSequence> sequences = new ArrayList<>();
public Reader(File fastaFile) {
try {
FileInputStream inStream = new FileInputStream(fastaFile);
FastaReader<ProteinSequence, AminoAcidCompound> fastaReader
= new FastaReader<>(
inStream,
new GenericFastaHeaderParser<ProteinSequence, AminoAcidCompound>(),
new ProteinSequenceCreator(AminoAcidCompoundSet.getAminoAcidCompoundSet()));
LinkedHashMap<String, ProteinSequence> b = fastaReader.process();
sequences.addAll(b.values());
} catch (IOException ex) {
Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
}
}
public List<ProteinSequence> getSequences() {
return sequences;
}
}
В IDE (Netbeans) классы обнаруживаются и используются при автозаполнении, и проект строится успешно, в каждом случае это указывает на то, что в основном зависимости установлены правильно.
2 ответа
Я много занимался поиском и обнаружил, что настоящий виновник - slf4j, который используется во всей BioJava. Я не знаю, почему оно замораживает приложение платформы, но я могу заставить мой модуль не устанавливаться, создав в нем регистратор slf4j. Я видел решение онлайн для модуля оболочки, и оказалось, что достаточно создать оболочку для org.slf4j:slf4j-api:x.y.z
вместе с org.slf4j:slf4j-jdk14:x.y.z
, добавлять org.slf4j.*
для публичных пакетов. Вот POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>group</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>slf4jwrapper</artifactId>
<packaging>nbm</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<publicPackages>
<publicPackage>org.slf4j.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.netbeans.api</groupId>
<artifactId>org-netbeans-api-annotations-common</artifactId>
<version>${netbeans.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Затем оболочку следует использовать в зависимых от BioJava модулях, но она должна работать и для других модулей, в зависимости от slf4j.
Прежде всего, проверьте манифест модуля оболочки, чтобы увидеть, все ли записи сгенерированы правильно, тем более что вы определяете useOSGiDependencies==true. Возможно, что jar-файлы biojava содержат заголовки osgi, и тогда вы не заключаете jars в модуль, а объявляете зависимость от плагина osgi.
Однако блокировка приложения - это странно, если бы что-то не так с зависимостями времени выполнения, я бы ожидал раннюю ошибку "неудовлетворенных зависимостей". Возможно, вы захотите создать дамп потока и проверить, что происходит. Может быть, у вас тупик. Или, поскольку ваше действие (jButton1ActionPerformed) вызывается из AWT, возможно, все чтение занимает время, и ваш поток пользовательского интерфейса заблокирован.