"The library has been modified by another program"

Hi,

I am always getting this message after saving the library in Jabref. I have the choice to “Dismiss changes” or “Review changes”.

I don’t understand it and frankly it is quite annoying. Can I turn it off somehow?

claudius

Please provide information on your JabRef version. Which version are you using? On which operating system?

This was a problem in earlier versions of JabRef, but (supposedly) had been fixed in more recent ones.

I’ve just faced the very same issue today. Even if I restarted my computer, and jabref was the only open application. Even if I accept the changes, and save the database again, the same messages pops up and I have to accept the very same changes, I’ve already accepted.

JabRef 5.2–2020-12-24–6a2a512
Linux 5.4.0-66-generic amd64, (Xubuntu 20.04 LTS)
Java 15.0.1

This just happened to me.

I just upgraded from v4.3.1 to v5.4 (trying the jump from v4 to v5 again). Windows 10, Java Version 8 Update 311, Installer version

The bib file is definitely not open in any other program.

By reviewing the changes, I see special characters in abstracts in wrong encoding from the original import, e.g. German a-Umlaut, or Greek mu. The left comparison column “in Jabref” has the original wrong encoding, the right column has the character corrected.

I cannot just “accept changes”, since then the program pops up an exception (the below is typed by hand since the popup doesn’t let me cut and paste):
Uncaught exception occurred in Thread[JavaFX Application Thread,5,main]
Cannot invoke “org.jabref.gui.mergeentries.MergeEntries.getMergeEntry()” because “this.mergePanel” is null

Not copying the loooong “exception stacktrace”, unless you ask me to.

Thanks for any pointers.

Can you please open an issue with the whole stack trace for the merge entries?
Screenshot would be okay

Thanks for the feedback.

The “library has been modified” error hasn’t happened again. From yesterday to today I rebooted, that may have had an effect. Maybe only people that just switched versions will run into this?

Will update with stack trace if it happens again.

Hi mrfjab
I ran into the same problem, see: Jabref 5.4 crashes, see: Jabref 5.4 crashes :sleepy:

Just happened again. I’m noticing this is my work computer, where on my laptop this didn’t occur. From what I can tell, both have the same Windows and Java version, see above.

The “External changes” merge window then threw the same exception up when trying to “accept changes”.

Stacktrace below:

java.lang.NullPointerException: Cannot invoke “org.jabref.gui.mergeentries.MergeEntries.getMergeEntry()” because “this.mergePanel” is null
at org.jabref@5.4.60000/org.jabref.gui.collab.EntryChangeViewModel.makeChange(Unknown Source)
at org.jabref@5.4.60000/org.jabref.gui.collab.ChangeDisplayDialog.lambda$new$2(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.control.Dialog.setResultAndClose(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.control.DialogPane.lambda$createButton$3(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Node.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.control.Button.fire(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.scene.control.inputmap.InputMap.handle(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Scene.processMouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.win.WinApplication._enterNestedEventLoopImpl(Native Method)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.win.WinApplication._enterNestedEventLoop(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.Application.enterNestedEventLoop(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.EventLoop.enter(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.stage.Stage.showAndWait(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.control.HeavyweightDialog.showAndWait(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.control.Dialog.showAndWait(Unknown Source)
at org.jabref@5.4.60000/org.jabref.gui.JabRefDialogService.showCustomDialogAndWait(Unknown Source)
at org.jabref@5.4.60000/org.jabref.gui.collab.DatabaseChangePane.lambda$onDatabaseChanged$1(Unknown Source)
at org.jabref.merged.module@5.4.60000/org.controlsfx.control.action.Action.handle(Unknown Source)
at org.jabref.merged.module@5.4.60000/org.controlsfx.control.action.Action.handle(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Node.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.control.Button.fire(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.scene.control.inputmap.InputMap.handle(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Scene.processMouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at org.jabref.merged.module@5.4.60000/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

Thanks for the detailed stack trace. I could reproduce this now.
Preparing a fix

Anything new? Meanwhile I’ve been go back to 5.3. :grinning:

Yes, the exception is fixed in 5.5

Well, I tried this version 5.5 approx. 18days ago. But then it has been failed again. :pensive:

It seems you are confusing the versions. You probably mean 5.4
In the meantime we released 5.5 which contains a fix for the exception. Release JabRef Version 5.5 · JabRef/jabref · GitHub

I am using 5.5 and that error still occures when I added entries to a new group, so maybe there is still another bug causing this.

JabRef 5.5–2022-01-17–27a05c7
Windows 10 10.0 amd64
Java 16.0.2
JavaFX 17.0.1+1

I am still getting this error in Jabref 5.7. I have re-installed Jabref 5.7 more than once but that has not changed the behavior. I am wondering if this might be caused by settings left over from a previous install of an older version that was uninstalled.

My version details are as follows:
JabRef 5.7–2022-08-05–73c111c
Windows 10 10.0 amd64
Java 18.0.2
JavaFX 18.0.1+2

Please try the newest development version for JabRef 5.8, which can be downloaded from here (Please create a backup of your library before trying the development version). There have been extensive changes and improvements to the way how JabRef saves libraries under the hood and some bugs have been found (and solved) that reliably triggered “the library has been modified by another program” without the users intention. I believe with the new version this bug should be gone for good.

Here you can have a look at the pre-release changelog: https://github.com/JabRef/jabref/blob/main/CHANGELOG.md

Hello! I’ve seen this issue on github as fixed but I’m experiencing the same issue in JabRef 5.9. It’s not consistent and does not happen every time I try to save my library. But when it happens it keeps happening until I accept/deny the changes (dismiss does not work). It’s more frequent when I’m importing more articles therefore and also when I try to save the library while not everything is done.
Also this issue sometimes ends with broken .bib files (interrupted in the middle of an entry) and for some reason on my computer the backup also behaves weirdly so if the program freezes and I shut it down I’m not able to restore it from the backup in the program (the backup is not empty, so copy-paste works but if I try to load it from the dialog within the program it loads empty library - no articles no groups).
it does it also when the autosave is turned on.

I’m running:
JabRef 5.9–2023-01-08–76253f1a7
Linux 6.1.0-9-amd64 amd64
Java 19.0.1
JavaFX 19+11

I guess this was a case of “never say never”. Once again, there have been some improvements to the backup feature in the newest development version of JabRef, which is very much related to “The library has been modified by another program” notifications.

@evkamat If you could try the newest development version that might at least solve some and hopefully all of your problems. Make sure to create a backup of your library before you try the development version!

Yes that should be fixed in the latest development version.

There is only one time that it can happen when you open the library properties

Do you have any idea why your computer freezes? Is there a surefire way to reproduce it? - You could check the issues that are performance related. Maybe something catches your eye. Issues · JabRef/jabref · GitHub. Also please have a look at FAQ: I have a huge library. What can I do to mitigate performance issues?

I am a little concerned that you end up with broken .bib files, but I suspect it might simply be a symptom of your computer freezing up and JabRef being shut down by force, but even then this is something that should not happen.

In general, JabRef creates multiple backups, so if the newest backup is broken, you can restore an older version of your library. The whole process is explained in the docs at https://docs.jabref.org/advanced/autosave

Most importantly, if something is seriously broken, check your backup folder as soon as possible, because if you continue as if nothing happened, at one point in time, JabRef will overwrite older backups. JabRef will create 10 backups for the same library file at most.