Browse Source

Merge pull request #1688 from cryptomator/feature/modular

Add module-info.java
Sebastian Stenzel 3 years ago
parent
commit
6da26b09b6
29 changed files with 186 additions and 62 deletions
  1. 8 1
      assembly-linux.xml
  2. 8 1
      assembly-mac.xml
  3. 8 1
      assembly-win.xml
  4. 47 7
      pom.xml
  5. 61 0
      src/main/java/module-info.java
  6. 8 0
      src/main/java/org/cryptomator/common/Nullable.java
  7. 1 1
      src/main/java/org/cryptomator/common/settings/VaultSettings.java
  8. 1 1
      src/main/java/org/cryptomator/common/vaults/VaultComponent.java
  9. 1 1
      src/main/java/org/cryptomator/common/vaults/VaultModule.java
  10. 1 1
      src/main/java/org/cryptomator/ui/common/ErrorComponent.java
  11. 2 1
      src/main/java/org/cryptomator/ui/common/ErrorController.java
  12. 5 10
      src/main/java/org/cryptomator/ui/common/FxmlLoaderFactory.java
  13. 1 1
      src/main/resources/fxml/addvault_new_password.fxml
  14. 1 1
      src/main/resources/fxml/addvault_new_recoverykey.fxml
  15. 1 1
      src/main/resources/fxml/addvault_welcome.fxml
  16. 1 1
      src/main/resources/fxml/changepassword.fxml
  17. 1 1
      src/main/resources/fxml/health_check_list.fxml
  18. 4 4
      src/main/resources/fxml/main_window.fxml
  19. 5 5
      src/main/resources/fxml/preferences.fxml
  20. 1 1
      src/main/resources/fxml/preferences_about.fxml
  21. 1 1
      src/main/resources/fxml/recoverykey_reset_password.fxml
  22. 1 1
      src/main/resources/fxml/recoverykey_success.fxml
  23. 5 5
      src/main/resources/fxml/unlock_enter_password.fxml
  24. 1 1
      src/main/resources/fxml/vault_detail_welcome.fxml
  25. 4 4
      src/main/resources/fxml/vault_options.fxml
  26. 2 7
      src/main/resources/license/THIRD-PARTY.txt
  27. 2 1
      src/package/launcher-linux.sh
  28. 2 1
      src/package/launcher-mac.sh
  29. 2 1
      src/package/launcher-win.bat

+ 8 - 1
assembly-linux.xml

@@ -34,7 +34,14 @@
 			<includes>
 				<include>cryptomator-*.jar</include>
 			</includes>
-			<outputDirectory>libs</outputDirectory>
+			<outputDirectory>mods</outputDirectory>
+		</fileSet>
+		<fileSet>
+			<directory>target/mods</directory>
+			<includes>
+				<include>*.jar</include>
+			</includes>
+			<outputDirectory>mods</outputDirectory>
 		</fileSet>
 		<fileSet>
 			<directory>target/libs</directory>

+ 8 - 1
assembly-mac.xml

@@ -34,7 +34,14 @@
 			<includes>
 				<include>cryptomator-*.jar</include>
 			</includes>
-			<outputDirectory>libs</outputDirectory>
+			<outputDirectory>mods</outputDirectory>
+		</fileSet>
+		<fileSet>
+			<directory>target/mods</directory>
+			<includes>
+				<include>*.jar</include>
+			</includes>
+			<outputDirectory>mods</outputDirectory>
 		</fileSet>
 		<fileSet>
 			<directory>target/libs</directory>

+ 8 - 1
assembly-win.xml

@@ -34,7 +34,14 @@
 			<includes>
 				<include>cryptomator-*.jar</include>
 			</includes>
-			<outputDirectory>libs</outputDirectory>
+			<outputDirectory>mods</outputDirectory>
+		</fileSet>
+		<fileSet>
+			<directory>target/mods</directory>
+			<includes>
+				<include>*.jar</include>
+			</includes>
+			<outputDirectory>mods</outputDirectory>
 		</fileSet>
 		<fileSet>
 			<directory>target/libs</directory>

+ 47 - 7
pom.xml

@@ -23,6 +23,9 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.jdk.version>16</project.jdk.version>
 
+		<!-- Group IDs of jars that need to stay on the class path for now -->
+		<nonModularGroupIds>com.github.serceman,com.github.jnr,org.ow2.asm,net.java.dev.jna,org.apache.jackrabbit,org.apache.httpcomponents</nonModularGroupIds>
+
 		<!-- cryptomator dependencies -->
 		<cryptomator.cryptofs.version>2.1.0-beta9</cryptomator.cryptofs.version>
 		<cryptomator.integrations.version>1.0.0-rc1</cryptomator.integrations.version>
@@ -41,6 +44,7 @@
 		<guava.version>30.1.1-jre</guava.version>
 		<dagger.version>2.37</dagger.version>
 		<gson.version>2.8.7</gson.version>
+		<zxcvbn.version>1.5.2</zxcvbn.version>
 		<slf4j.version>1.7.31</slf4j.version>
 		<logback.version>1.2.3</logback.version>
 
@@ -142,7 +146,7 @@
 		<dependency>
 			<groupId>com.nulab-inc</groupId>
 			<artifactId>zxcvbn</artifactId>
-			<version>1.3.0</version>
+			<version>${zxcvbn.version}</version>
 		</dependency>
 
 		<!-- Google -->
@@ -150,6 +154,29 @@
 			<groupId>com.google.guava</groupId>
 			<artifactId>guava</artifactId>
 			<version>${guava.version}</version>
+			<exclusions>
+				<!-- see https://github.com/google/guava/wiki/UseGuavaInYourBuild#what-about-guavas-own-dependencies -->
+				<exclusion>
+					<groupId>com.google.guava</groupId>
+					<artifactId>listenablefuture</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.code.findbugs</groupId>
+					<artifactId>jsr305</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.checkerframework</groupId>
+					<artifactId>checker-qual</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.errorprone</groupId>
+					<artifactId>error_prone_annotations</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.j2objc</groupId>
+					<artifactId>j2objc-annotations</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<dependency>
 			<groupId>com.google.dagger</groupId>
@@ -211,7 +238,7 @@
 				<plugin>
 					<groupId>org.apache.maven.plugins</groupId>
 					<artifactId>maven-dependency-plugin</artifactId>
-					<version>3.1.2</version>
+					<version>3.2.0</version>
 				</plugin>
 				<plugin>
 					<groupId>org.apache.maven.plugins</groupId>
@@ -221,7 +248,7 @@
 				<plugin>
 					<groupId>org.apache.maven.plugins</groupId>
 					<artifactId>maven-surefire-plugin</artifactId>
-					<version>2.22.2</version>
+					<version>3.0.0-M5</version>
 				</plugin>
 				<plugin>
 					<groupId>org.codehaus.mojo</groupId>
@@ -314,6 +341,19 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-dependency-plugin</artifactId>
 				<executions>
+					<execution>
+						<id>copy-mods</id>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<includeScope>runtime</includeScope>
+							<outputDirectory>${project.build.directory}/mods</outputDirectory>
+							<excludeClassifiers>linux,mac,win</excludeClassifiers>
+							<excludeGroupIds>${nonModularGroupIds}</excludeGroupIds>
+						</configuration>
+					</execution>
 					<execution>
 						<id>copy-libs</id>
 						<phase>prepare-package</phase>
@@ -323,7 +363,7 @@
 						<configuration>
 							<includeScope>runtime</includeScope>
 							<outputDirectory>${project.build.directory}/libs</outputDirectory>
-							<excludeClassifiers>linux,mac,win</excludeClassifiers>
+							<includeGroupIds>${nonModularGroupIds}</includeGroupIds>
 						</configuration>
 					</execution>
 				</executions>
@@ -467,7 +507,7 @@
 									<goal>copy-dependencies</goal>
 								</goals>
 								<configuration>
-									<outputDirectory>${project.build.directory}/libs</outputDirectory>
+									<outputDirectory>${project.build.directory}/mods</outputDirectory>
 									<includeGroupIds>org.openjfx</includeGroupIds>
 									<classifier>mac</classifier>
 								</configuration>
@@ -529,7 +569,7 @@
 									<goal>copy-dependencies</goal>
 								</goals>
 								<configuration>
-									<outputDirectory>${project.build.directory}/libs</outputDirectory>
+									<outputDirectory>${project.build.directory}/mods</outputDirectory>
 									<includeGroupIds>org.openjfx</includeGroupIds>
 									<classifier>linux</classifier>
 								</configuration>
@@ -590,7 +630,7 @@
 									<goal>copy-dependencies</goal>
 								</goals>
 								<configuration>
-									<outputDirectory>${project.build.directory}/libs</outputDirectory>
+									<outputDirectory>${project.build.directory}/mods</outputDirectory>
 									<includeGroupIds>org.openjfx</includeGroupIds>
 									<classifier>win</classifier>
 								</configuration>

+ 61 - 0
src/main/java/module-info.java

@@ -0,0 +1,61 @@
+import org.cryptomator.integrations.autostart.AutoStartProvider;
+import org.cryptomator.integrations.keychain.KeychainAccessProvider;
+import org.cryptomator.integrations.tray.TrayIntegrationProvider;
+import org.cryptomator.integrations.uiappearance.UiAppearanceProvider;
+
+module org.cryptomator.desktop {
+	requires org.cryptomator.cryptofs;
+	requires org.cryptomator.frontend.dokany;
+	requires org.cryptomator.frontend.fuse;
+	requires org.cryptomator.frontend.webdav;
+	requires org.cryptomator.integrations.api;
+	requires java.rmi;
+	requires java.desktop;
+	requires java.net.http;
+	requires javafx.base;
+	requires javafx.graphics;
+	requires javafx.controls;
+	requires javafx.fxml;
+	requires com.tobiasdiez.easybind;
+	requires com.google.common;
+	requires com.google.gson;
+	requires com.nulabinc.zxcvbn;
+	requires org.slf4j;
+	requires org.apache.commons.lang3;
+	requires dagger;
+	requires com.auth0.jwt;
+
+	/* TODO: filename-based modules: */
+	requires static javax.inject; /* ugly dagger/guava crap */
+	requires logback.classic;
+	requires logback.core;
+
+	uses AutoStartProvider;
+	uses KeychainAccessProvider;
+	uses TrayIntegrationProvider;
+	uses UiAppearanceProvider;
+
+	opens org.cryptomator.common.settings to com.google.gson;
+
+	opens org.cryptomator.launcher to java.rmi;
+
+	opens org.cryptomator.common to javafx.fxml;
+	opens org.cryptomator.common.vaults to javafx.fxml;
+	opens org.cryptomator.ui.addvaultwizard to javafx.fxml;
+	opens org.cryptomator.ui.changepassword to javafx.fxml;
+	opens org.cryptomator.ui.common to javafx.fxml;
+	opens org.cryptomator.ui.controls to javafx.fxml;
+	opens org.cryptomator.ui.forgetPassword to javafx.fxml;
+	opens org.cryptomator.ui.fxapp to javafx.fxml;
+	opens org.cryptomator.ui.keyloading.masterkeyfile to javafx.fxml;
+	opens org.cryptomator.ui.mainwindow to javafx.fxml;
+	opens org.cryptomator.ui.migration to javafx.fxml;
+	opens org.cryptomator.ui.preferences to javafx.fxml;
+	opens org.cryptomator.ui.quit to javafx.fxml;
+	opens org.cryptomator.ui.recoverykey to javafx.fxml;
+	opens org.cryptomator.ui.removevault to javafx.fxml;
+	opens org.cryptomator.ui.stats to javafx.fxml;
+	opens org.cryptomator.ui.unlock to javafx.fxml;
+	opens org.cryptomator.ui.vaultoptions to javafx.fxml;
+	opens org.cryptomator.ui.wrongfilealert to javafx.fxml;
+}

+ 8 - 0
src/main/java/org/cryptomator/common/Nullable.java

@@ -0,0 +1,8 @@
+package org.cryptomator.common;
+
+/**
+ * Replacement for JSR-305 to avoid runtime dependencies. Used in Dagger components.
+ */
+public @interface Nullable {
+
+}

+ 1 - 1
src/main/java/org/cryptomator/common/settings/VaultSettings.java

@@ -43,7 +43,7 @@ public class VaultSettings {
 	private static final Random RNG = new Random();
 
 	private final String id;
-	private final ObjectProperty<Path> path = new SimpleObjectProperty();
+	private final ObjectProperty<Path> path = new SimpleObjectProperty<>();
 	private final StringProperty displayName = new SimpleStringProperty();
 	private final StringProperty winDriveLetter = new SimpleStringProperty();
 	private final BooleanProperty unlockAfterStartup = new SimpleBooleanProperty(DEFAULT_UNLOCK_AFTER_STARTUP);

+ 1 - 1
src/main/java/org/cryptomator/common/vaults/VaultComponent.java

@@ -7,10 +7,10 @@ package org.cryptomator.common.vaults;
 
 import dagger.BindsInstance;
 import dagger.Subcomponent;
+import org.cryptomator.common.Nullable;
 import org.cryptomator.common.mountpoint.MountPointChooserModule;
 import org.cryptomator.common.settings.VaultSettings;
 
-import javax.annotation.Nullable;
 import javax.inject.Named;
 
 @PerVault

+ 1 - 1
src/main/java/org/cryptomator/common/vaults/VaultModule.java

@@ -8,6 +8,7 @@ package org.cryptomator.common.vaults;
 import dagger.Module;
 import dagger.Provides;
 import org.apache.commons.lang3.SystemUtils;
+import org.cryptomator.common.Nullable;
 import org.cryptomator.common.settings.Settings;
 import org.cryptomator.common.settings.VaultSettings;
 import org.cryptomator.common.settings.VolumeImpl;
@@ -15,7 +16,6 @@ import org.cryptomator.cryptofs.CryptoFileSystem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.annotation.Nullable;
 import javax.inject.Named;
 import javafx.beans.binding.Bindings;
 import javafx.beans.binding.StringBinding;

+ 1 - 1
src/main/java/org/cryptomator/ui/common/ErrorComponent.java

@@ -2,8 +2,8 @@ package org.cryptomator.ui.common;
 
 import dagger.BindsInstance;
 import dagger.Subcomponent;
+import org.cryptomator.common.Nullable;
 
-import javax.annotation.Nullable;
 import javafx.application.Platform;
 import javafx.scene.Scene;
 import javafx.stage.Stage;

+ 2 - 1
src/main/java/org/cryptomator/ui/common/ErrorController.java

@@ -1,6 +1,7 @@
 package org.cryptomator.ui.common;
 
-import javax.annotation.Nullable;
+import org.cryptomator.common.Nullable;
+
 import javax.inject.Inject;
 import javax.inject.Named;
 import javafx.fxml.FXML;

+ 5 - 10
src/main/java/org/cryptomator/ui/common/FxmlLoaderFactory.java

@@ -5,7 +5,6 @@ import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.UncheckedIOException;
 import java.util.Map;
 import java.util.ResourceBundle;
@@ -26,11 +25,9 @@ public class FxmlLoaderFactory {
 	/**
 	 * @return A new FXMLLoader instance
 	 */
-	public FXMLLoader construct() {
-		FXMLLoader loader = new FXMLLoader();
-		loader.setControllerFactory(this::constructController);
-		loader.setResources(resourceBundle);
-		return loader;
+	private FXMLLoader construct(String fxmlResourceName) {
+		var url = getClass().getResource(fxmlResourceName);
+		return new FXMLLoader(url, resourceBundle, null, this::constructController);
 	}
 
 	/**
@@ -41,10 +38,8 @@ public class FxmlLoaderFactory {
 	 * @throws IOException if an error occurs while loading the FXML file
 	 */
 	public FXMLLoader load(String fxmlResourceName) throws IOException {
-		FXMLLoader loader = construct();
-		try (InputStream in = getClass().getResourceAsStream(fxmlResourceName)) {
-			loader.load(in);
-		}
+		FXMLLoader loader = construct(fxmlResourceName);
+		loader.load();
 		return loader;
 	}
 

+ 1 - 1
src/main/resources/fxml/addvault_new_password.fxml

@@ -23,7 +23,7 @@
 		<Insets topRightBottomLeft="24"/>
 	</padding>
 	<children>
-		<fx:include fx:id="newPasswordScene" source="/fxml/new_password.fxml"/>
+		<fx:include fx:id="newPasswordScene" source="new_password.fxml"/>
 
 		<Region VBox.vgrow="ALWAYS"/>
 

+ 1 - 1
src/main/resources/fxml/addvault_new_recoverykey.fxml

@@ -18,7 +18,7 @@
 	<children>
 		<Region VBox.vgrow="ALWAYS"/>
 
-		<fx:include source="/fxml/recoverykey_display.fxml"/>
+		<fx:include source="recoverykey_display.fxml"/>
 
 		<Region VBox.vgrow="ALWAYS"/>
 

+ 1 - 1
src/main/resources/fxml/addvault_welcome.fxml

@@ -21,7 +21,7 @@
 		<Region VBox.vgrow="ALWAYS"/>
 
 		<ImageView VBox.vgrow="ALWAYS" fitHeight="128" preserveRatio="true" smooth="true" cache="true">
-			<Image url="/img/bot/bot.png"/>
+			<Image url="@../img/bot/bot.png"/>
 		</ImageView>
 
 		<Region VBox.vgrow="ALWAYS"/>

+ 1 - 1
src/main/resources/fxml/changepassword.fxml

@@ -25,7 +25,7 @@
 
 		<Region prefHeight="12" VBox.vgrow="NEVER"/>
 
-		<fx:include fx:id="newPassword" source="/fxml/new_password.fxml"/>
+		<fx:include fx:id="newPassword" source="new_password.fxml"/>
 
 		<CheckBox fx:id="finalConfirmationCheckbox" text="%changepassword.finalConfirmation" wrapText="true"/>
 

+ 1 - 1
src/main/resources/fxml/health_check_list.fxml

@@ -33,7 +33,7 @@
 				<VBox minWidth="300" alignment="CENTER" visible="${!controller.anyCheckSelected}" managed="${!controller.anyCheckSelected}" >
 					<Label text="%health.check.detail.noSelectedCheck" wrapText="true" alignment="CENTER" />
 				</VBox>
-				<fx:include  source="/fxml/health_check_details.fxml" visible="${controller.anyCheckSelected}" managed="${controller.anyCheckSelected}" />
+				<fx:include source="health_check_details.fxml" visible="${controller.anyCheckSelected}" managed="${controller.anyCheckSelected}" />
 			</StackPane>
 		</HBox>
 		<ButtonBar buttonMinWidth="120" buttonOrder="+CX">

+ 4 - 4
src/main/resources/fxml/main_window.fxml

@@ -13,11 +13,11 @@
 		   fx:controller="org.cryptomator.ui.mainwindow.MainWindowController"
 		   styleClass="main-window">
 	<VBox>
-		<fx:include source="/fxml/main_window_title.fxml" VBox.vgrow="NEVER"/>
+		<fx:include source="main_window_title.fxml" VBox.vgrow="NEVER"/>
 		<StackPane VBox.vgrow="ALWAYS">
 			<SplitPane dividerPositions="0.33" orientation="HORIZONTAL">
-				<fx:include source="/fxml/vault_list.fxml" SplitPane.resizableWithParent="false"/>
-				<fx:include source="/fxml/vault_detail.fxml" SplitPane.resizableWithParent="true"/>
+				<fx:include source="vault_list.fxml" SplitPane.resizableWithParent="false"/>
+				<fx:include source="vault_detail.fxml" SplitPane.resizableWithParent="true"/>
 			</SplitPane>
 
 			<VBox styleClass="drag-n-drop-indicator" visible="${controller.draggingOver}" alignment="TOP_CENTER">
@@ -33,5 +33,5 @@
 			</VBox>
 		</StackPane>
 	</VBox>
-	<fx:include source="/fxml/main_window_resize.fxml"/>
+	<fx:include source="main_window_resize.fxml"/>
 </StackPane>

+ 5 - 5
src/main/resources/fxml/preferences.fxml

@@ -19,7 +19,7 @@
 				<FontAwesome5IconView glyph="WRENCH"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/preferences_general.fxml"/>
+				<fx:include source="preferences_general.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="volumeTab" id="VOLUME" text="%preferences.volume">
@@ -27,7 +27,7 @@
 				<FontAwesome5IconView glyph="HDD"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/preferences_volume.fxml"/>
+				<fx:include source="preferences_volume.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="updatesTab" id="UPDATES" text="%preferences.updates">
@@ -35,7 +35,7 @@
 				<FontAwesome5IconView glyph="SYNC"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/preferences_updates.fxml"/>
+				<fx:include source="preferences_updates.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="contributeTab" id="CONTRIBUTE" text="%preferences.contribute">
@@ -43,7 +43,7 @@
 				<FontAwesome5IconView glyph="HEART"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/preferences_contribute.fxml"/>
+				<fx:include source="preferences_contribute.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="aboutTab" id="ABOUT" text="%preferences.about">
@@ -51,7 +51,7 @@
 				<FontAwesome5IconView glyph="INFO_CIRCLE"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/preferences_about.fxml"/>
+				<fx:include source="preferences_about.fxml"/>
 			</content>
 		</Tab>
 	</tabs>

+ 1 - 1
src/main/resources/fxml/preferences_about.fxml

@@ -18,7 +18,7 @@
 	<children>
 		<HBox spacing="12" VBox.vgrow="NEVER">
 			<ImageView VBox.vgrow="ALWAYS" fitHeight="64" preserveRatio="true" smooth="true" cache="true">
-				<Image url="/img/bot/bot.png"/>
+				<Image url="@../img/bot/bot.png"/>
 			</ImageView>
 			<VBox spacing="3" HBox.hgrow="ALWAYS" alignment="CENTER_LEFT">
 				<FormattedLabel styleClass="label-large" format="Cryptomator %s" arg1="${controller.applicationVersion}"/>

+ 1 - 1
src/main/resources/fxml/recoverykey_reset_password.fxml

@@ -17,7 +17,7 @@
 		<Insets topRightBottomLeft="12"/>
 	</padding>
 	<children>
-		<fx:include fx:id="newPassword" source="/fxml/new_password.fxml"/>
+		<fx:include fx:id="newPassword" source="new_password.fxml"/>
 
 		<Region VBox.vgrow="ALWAYS"/>
 

+ 1 - 1
src/main/resources/fxml/recoverykey_success.fxml

@@ -17,7 +17,7 @@
 		<Insets topRightBottomLeft="12"/>
 	</padding>
 	<children>
-		<fx:include source="/fxml/recoverykey_display.fxml"/>
+		<fx:include source="recoverykey_display.fxml"/>
 
 		<Region VBox.vgrow="ALWAYS"/>
 

+ 5 - 5
src/main/resources/fxml/unlock_enter_password.fxml

@@ -26,23 +26,23 @@
 		<HBox spacing="12" VBox.vgrow="ALWAYS">
 			<StackPane alignment="CENTER" HBox.hgrow="NEVER">
 				<ImageView VBox.vgrow="ALWAYS" fitWidth="64" preserveRatio="true" smooth="true" cache="true" fx:id="face" visible="false">
-					<Image url="/img/bot/face.png"/>
+					<Image url="@../img/bot/face.png"/>
 				</ImageView>
 
 				<ImageView VBox.vgrow="ALWAYS" fitWidth="64" preserveRatio="true" smooth="true" cache="true" fx:id="leftArm" visible="false">
-					<Image url="/img/bot/arm-l.png"/>
+					<Image url="@../img/bot/arm-l.png"/>
 				</ImageView>
 
 				<ImageView VBox.vgrow="ALWAYS" fitWidth="64" preserveRatio="true" smooth="true" cache="true" fx:id="rightArm" visible="false">
-					<Image url="/img/bot/arm-r.png"/>
+					<Image url="@../img/bot/arm-r.png"/>
 				</ImageView>
 
 				<ImageView VBox.vgrow="ALWAYS" fitWidth="64" preserveRatio="true" smooth="true" cache="true" fx:id="legs" visible="false">
-					<Image url="/img/bot/legs.png"/>
+					<Image url="@../img/bot/legs.png"/>
 				</ImageView>
 
 				<ImageView VBox.vgrow="ALWAYS" fitWidth="64" preserveRatio="true" smooth="true" cache="true" fx:id="body">
-					<Image url="/img/bot/body.png"/>
+					<Image url="@../img/bot/body.png"/>
 				</ImageView>
 			</StackPane>
 			<VBox spacing="6" HBox.hgrow="ALWAYS">

+ 1 - 1
src/main/resources/fxml/vault_detail_welcome.fxml

@@ -11,7 +11,7 @@
 	  spacing="24">
 	<children>
 		<ImageView VBox.vgrow="ALWAYS" fitHeight="128" preserveRatio="true" smooth="true" cache="true">
-			<Image url="/img/bot/bot.png"/>
+			<Image url="@../img/bot/bot.png"/>
 		</ImageView>
 
 		<TextFlow styleClass="text-flow" prefWidth="-Infinity" visible="${controller.noVaultPresent}" managed="${controller.noVaultPresent}">

+ 4 - 4
src/main/resources/fxml/vault_options.fxml

@@ -17,7 +17,7 @@
 				<FontAwesome5IconView glyph="WRENCH"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/vault_options_general.fxml"/>
+				<fx:include source="vault_options_general.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="mountTab" id="MOUNT" text="%vaultOptions.mount">
@@ -25,7 +25,7 @@
 				<FontAwesome5IconView glyph="HDD"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/vault_options_mount.fxml"/>
+				<fx:include source="vault_options_mount.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="keyTab" id="KEY" text="%vaultOptions.masterkey">
@@ -33,7 +33,7 @@
 				<FontAwesome5IconView glyph="KEY"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/vault_options_masterkey.fxml"/>
+				<fx:include source="vault_options_masterkey.fxml"/>
 			</content>
 		</Tab>
 		<Tab fx:id="healthTab" id="HEALTH" text="%vaultOptions.health">
@@ -41,7 +41,7 @@
 				<FontAwesome5IconView glyph="STETHOSCOPE"/>
 			</graphic>
 			<content>
-				<fx:include source="/fxml/vault_options_health.fxml"/>
+				<fx:include source="vault_options_health.fxml"/>
 			</content>
 		</Tab>
 	</tabs>

+ 2 - 7
src/main/resources/license/THIRD-PARTY.txt

@@ -11,20 +11,16 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see http://www.gnu.org/licenses/.
 
-Cryptomator uses 45 third-party dependencies under the following licenses:
+Cryptomator uses 40 third-party dependencies under the following licenses:
         Apache License v2.0:
 			- jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi)
 			- jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm)
 			- jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants)
 			- jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi)
-			- FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.2 - http://findbugs.sourceforge.net/)
 			- Gson (com.google.code.gson:gson:2.8.7 - https://github.com/google/gson/gson)
 			- Dagger (com.google.dagger:dagger:2.37 - https://github.com/google/dagger)
-			- error-prone annotations (com.google.errorprone:error_prone_annotations:2.5.1 - http://nexus.sonatype.org/oss-repository-hosting.html/error_prone_parent/error_prone_annotations)
 			- Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess)
 			- Guava: Google Core Libraries for Java (com.google.guava:guava:30.1.1-jre - https://github.com/google/guava/guava)
-			- Guava ListenableFuture only (com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava - https://github.com/google/guava/listenablefuture)
-			- J2ObjC Annotations (com.google.j2objc:j2objc-annotations:1.3 - https://github.com/google/j2objc/)
 			- Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/)
 			- javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/)
 			- Java Native Access (net.java.dev.jna:jna:5.7.0 - https://github.com/java-native-access/jna)
@@ -77,8 +73,7 @@ Cryptomator uses 45 third-party dependencies under the following licenses:
 			- java jwt (com.auth0:java-jwt:3.18.1 - https://github.com/auth0/java-jwt)
 			- jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm)
 			- jnr-fuse (com.github.serceman:jnr-fuse:0.5.5 - https://github.com/SerCeMan/jnr-fuse)
-			- zxcvbn4j (com.nulab-inc:zxcvbn:1.3.0 - https://github.com/nulab/zxcvbn4j)
-			- Checker Qual (org.checkerframework:checker-qual:3.8.0 - https://checkerframework.org)
+			- zxcvbn4j (com.nulab-inc:zxcvbn:1.5.2 - https://github.com/nulab/zxcvbn4j)
 			- SLF4J API Module (org.slf4j:slf4j-api:1.7.31 - http://www.slf4j.org)
         The BSD 2-Clause License:
 			- EasyBind (com.tobiasdiez:easybind:2.2 - https://github.com/tobiasdiez/EasyBind)

+ 2 - 1
src/package/launcher-linux.sh

@@ -1,6 +1,7 @@
 #!/bin/sh
 cd $(dirname $0)
 java \
+	-p "mods" \
 	-cp "libs/*" \
 	-Dcryptomator.settingsPath="~/.config/Cryptomator/settings.json" \
 	-Dcryptomator.ipcSocketPath="~/.config/Cryptomator/ipc.socket" \
@@ -9,4 +10,4 @@ java \
 	-Djdk.gtk.version=2 \
 	-Xss2m \
 	-Xmx512m \
-	org.cryptomator.launcher.Cryptomator
+	-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator

+ 2 - 1
src/package/launcher-mac.sh

@@ -1,6 +1,7 @@
 #!/bin/sh
 cd $(dirname $0)
 java \
+	-p "mods" \
 	-cp "libs/*" \
 	-Dcryptomator.settingsPath="~/Library/Application Support/Cryptomator/settings.json" \
 	-Dcryptomator.ipcSocketPath="~/Library/Application Support/Cryptomator/ipc.socket" \
@@ -8,4 +9,4 @@ java \
 	-Dcryptomator.mountPointsDir="/Volumes" \
 	-Xss20m \
 	-Xmx512m \
-	org.cryptomator.launcher.Cryptomator
+	-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator

+ 2 - 1
src/package/launcher-win.bat

@@ -1,5 +1,6 @@
 @echo off
 java ^
+	-p "mods" ^
 	-cp "libs/*" ^
 	-Dcryptomator.settingsPath="~/AppData/Roaming/Cryptomator/settings.json" ^
 	-Dcryptomator.ipcSocketPath="~/AppData/Roaming/Cryptomator/ipc.socket" ^
@@ -8,4 +9,4 @@ java ^
 	-Dcryptomator.keychainPath="~/AppData/Roaming/Cryptomator/keychain.json" ^
 	-Xss20m ^
 	-Xmx512m ^
-	org.cryptomator.launcher.Cryptomator
+	-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator