我正在构建一个 Maven 项目,它可以工作并且我可以使用它。但是在组装之后,我通常会在控制台中看到类似这样的消息:
Exception in thread "main" java.lang.StackOverflowError
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at java.io.PrintStream.write(PrintStream.java:482)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.write(PrintStream.java:527)
at java.io.PrintStream.print(PrintStream.java:583)
at org.fusesource.jansi.FilterPrintStream.write(FilterPrintStream.java:99)
at org.fusesource.jansi.FilterPrintStream.write(FilterPrintStream.java:107)
at org.fusesource.jansi.FilterPrintStream.print(FilterPrintStream.java:156)
at org.fusesource.jansi.FilterPrintStream.println(FilterPrintStream.java:231)
at org.slf4j.impl.SimpleLogger.write(SimpleLogger.java:318)
at org.slf4j.impl.SimpleLogger.log(SimpleLogger.java:295)
at org.slf4j.impl.SimpleLogger.info(SimpleLogger.java:480)
at org.apache.maven.cli.logging.Slf4jLogger.info(Slf4jLogger.java:59)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:464)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
我的主要功能代码:
public static void main(String[] args) throws IOException, SAXException, TikaException, InterruptedException, FileNotFoundException, JDOMException {
numberQueue = 0; //Кол-во элементов в очереди
//Если запускать из среды: путь до файла config.xml
linkFileConfig = "D:\\Programs\\Qt\\Units\\MyJavaProjects\\"
+ "Qt-Java\\build-JavaQt-Desktop_Qt_5_9_1_MSVC2015_64bit-Profile\\"
+ "release\\config.xml";
//Использование logging---------------------------------------------------------
//Путь к файлу Log.txt
String linkLogFile = linkFileConfig.replace("config.xml", "Log.txt");
//Поток4 - Запись ошибок в файл Log.txt
threadWriteLog = new LogWritter(linkLogFile);
new Thread(threadWriteLog, "threadWriteLog").start();
//------------------------------------------------------------------------------
//Новое место для чтения файла config.xml с новыми параметрами------------------
//Начальная инициализация
oldCores = 0;
threadPool = new LinkedBlockingQueue<Runnable>();
serviceOne = new ThreadPoolExecutor(0, 10, 0L, TimeUnit.MILLISECONDS, threadPool);
//При первом запуске прочитать config.xml
//И сохранить директории
File configFile = new File(linkFileConfig);
Path = readConfig(configFile);
//------------------------------------------------------------------------------
//Открывается порт сервера для соединения
serverSocket = new ServerSocket(8000); //для отправки результата
//Открывается порт сервера для соединения
serverSocket2 = new ServerSocket(8001); //для отправки очереди
//Открывается порт сервера для соединения
serverSocket3 = new ServerSocket(8002); //для отправки очереди
//Сообщение: ждем соединения
System.out.println("Waiting for connected...");
//Ждем соединения с клиентом Qt
clientSocket = serverSocket.accept(); //для результата
//Ждем соединения с клиентом Qt
clientSocket2 = serverSocket2.accept(); //для очереди
writerSocketQueue = new OutputStreamWriter(clientSocket2.getOutputStream());
//Ждем соединения с клиентом Qt
clientSocket3 = serverSocket3.accept(); //для завершения Java
readSocket = new BufferedReader(
new InputStreamReader(clientSocket3.getInputStream()));
writeSockQt = new OutputStreamWriter(clientSocket3.getOutputStream());
//Поток5 - получаем сообщение от Qt для закрытия Java
Thread threadCloseJava = new Thread(new Closer());
threadCloseJava.start();
//Если соединились, тогда обрабатываем и отправляем статус
//Если соединения нет, то ожидаем его
while(clientSocket.isConnected()){
sendQueue(numberQueue); //Отправить текущее значение очереди
//Старый пути (in, out, task)
oldPath = Path;
//Поток1 - отслеживаем изм. файла config.mxl
Thread threadConfig = new Thread(new configThread(linkFileConfig));
threadConfig.start();
//Поток2 - отслеживаем изм. кол-ва файлов .dat
MyThread myThread = new MyThread(linkFileConfig);
new Thread(myThread, "MyThlread").start();
//Поток3 - отслеживаем изм. кол-ва файлов task.xml
ReadByte myThreadByte = new ReadByte(linkFileConfig);
new Thread(myThreadByte, "ReadByte").start();
boolean isWhile = true; //Для вечного чикла
while (isWhile) {
Thread.sleep(10);
//В файле config.xml был изменен путь до in директории
if (isChangeConfig) {
System.out.println("File config.xml has been changed by user");
//Изменяю флаг в файле MyThread.java
myThread.isStop();
//File newFile = new File(oldPath[0] + "/in.bat");
//Создаю файл (в старой папке) in директории для триггера
File newFile = new File(oldPath[0] + File.separator + "in.bat");
newFile.createNewFile();
//Изменяю флаг в class ReadByte
myThreadByte.isStopTask();
//Создаю файл в старой папке task для триггера
File newSysFileTask = new File(oldPath[2] + File.separator+ "task.bat");
newSysFileTask.createNewFile();
if(isRead == true){
//Прочитать файл заново
Path = readConfig(configFile);
isRead = false;
}
//Чтобы ниже не прочитывали конфиг файл
isChangeConfig = false;
//Равен ли новый in старому in?
boolean isEqually = Path[0].equals(oldPath[0]);
//не был изменен = true
//был изменен = false
if (isEqually == false) { //в конфиге был изменен in путь
isFront = true; //Чтобы зайти в нижний блок
}
else{ //в конфиге не был изм. in путь
//Чтобы не заходить в нижний блок
//Для исключения повторной обработки файлов
isFront = false;
isRead = true;
}
newFile.delete(); //Удалить файл in.bat
newSysFileTask.delete(); //Удалить файл task.bat
//Перезаписать старые пути
oldPath = Path;
} //if(isChangeConfig)
//Если не изменилась, то исп. старый Path[0]
File dir = new File(Path[0]); //Директория выборки
//Filter для выборки только файлов psp
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File dir) {
return dir.getName().endsWith("dat");
}
}; // конец Filter
//Сохранить в массив файлы .psp, исходя из Filter
File[] files = dir.listFiles(filter); //(00001.psp, 00001.dat)
int i = 0;
//Если файлов нет, то будет проход выше
if (files.length == 0) {
//Разрешить в верхнем блоке читать конфиг
isRead = true;
isFront = false;
}
if (isFront) {
//Начинаем проход по файлам того массива
for (File file : files) {
// Получить абсолютное имя файла (psp & dat)
String fileDat = file.getAbsolutePath(); //00001.psp
if (isChangeConfig) { //Если файл изменился, то
//Прочитываю файл config.xml
Path = readConfig(configFile);
//Равен ли новый путь старому
boolean isEqually = Path[0].equals(oldPath[0]);
//не был изменен = true
//был изменен = false
if(isEqually == false){ //в конфиге был изменен in путь
//Уже прочитали конфиг,
//не разрешаем еще раз его читать
isRead = false;
//Выйти из for и перейти на проверку в while
break;
}
else{ //в конфиге не был изменен in путь
//Изменяю флаг в class ReadByte
myThreadByte.isStopTask();
//Создаю файл в папке task для триггера
File newSysFileTask = new File(oldPath[2] + File.separator + "task.bat");
newSysFileTask.createNewFile();
//Удалить файл task.bat
newSysFileTask.delete();
//Перезапись старого in
oldPath = Path;
//Чтобы не заходить в секцию еще раз
isChangeConfig = false;
System.out.println("Текущий файл идет на обработку: " + file.getName());
serviceOne.submit(new Task(fileDat));
numberQueue++; //Изменить значение очереди
i++; //Какой сейчас файл в цикле
sendQueue(numberQueue); //Отправить это значение
}
} else {//Если не изменился конфиг файл, то создать поток обработки
System.out.println("Текущий файл идет на обработку: " + file.getName());
serviceOne.submit(new Task(fileDat));
numberQueue++; //Изменить значение очереди
i++; //Какой сейчас файл в цикле
sendQueue(numberQueue); //Отправить это значение
}
//Если обработали последний файл, то уже не идем на обработку
if ((files.length) == i) {
//System.out.println("Последний файл");
isFront = false;
//Разрешаем в верхнем блоке чтение конфига
isRead = true;
//Чтобы лишний раз не идти на проверку for
break;
}
} //for - по файлам массива
}//if
}//while (isWhile)
} //while(clientSocket.isConnected())
}//main
我阅读并发现 StackOverFlow 出现在堆栈溢出时。但是我仍然无法理解异常出现的原因。我无法理解这些行如何导致溢出。你能告诉我如何在这种情况下,可以看什么来解决它?也许还有其他方法?在此先感谢,任何建议将不胜感激。
我当前的 pom.xml,通过 maven 构建:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.mycompany.stackexp.Parser</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.mycompany.stackexp.Parser</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
添加
version
和groupId
你maven-assembler-plugin
的整理它:让它看起来像这样: