diff --git a/build.gradle b/build.gradle index 7718d6d..5e1a2ba 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ plugins { id 'java' id 'org.jetbrains.intellij' version '1.16.0' + id 'com.github.johnrengelman.shadow' version '8.1.1' } -group = "com.codemp" -version = "0.1.0" +group = 'com.codemp' +version = '0.1.0' java { sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 @@ -12,42 +13,51 @@ java { repositories { mavenCentral() + maven { url 'https://jitpack.io' } } dependencies { + implementation 'com.github.adamheinrich:native-utils:master-SNAPSHOT' implementation 'org.slf4j:slf4j-api:2.0.9' implementation 'ch.qos.logback:logback-classic:1.4.6' } intellij { - version.set("2022.2.5") - type.set("IC") + version.set('2022.2.5') + type.set('IC') } -def cargoDir = projectDir.toPath().resolve("target").resolve("release").toFile() +shadowJar { + archiveClassifier.set('') + dependencies { + include(dependency('com.github.adamheinrich:native-utils:master-SNAPSHOT')) + } +} + +def cargoDir = projectDir.toPath().resolve('target').resolve('release').toFile() processResources { from(cargoDir) { - include("*.dll") - include("*.so") - into("natives/") + include('*.dll') + include('*.so') + into('natives/') } } tasks { patchPluginXml { - sinceBuild.set("222") - untilBuild.set("232.*") + sinceBuild.set('222') + untilBuild.set('232.*') } signPlugin { - certificateChain.set(System.getenv("CERTIFICATE_CHAIN")) - privateKey.set(System.getenv("PRIVATE_KEY")) - password.set(System.getenv("PRIVATE_KEY_PASSWORD")) + certificateChain.set(System.getenv('CERTIFICATE_CHAIN')) + privateKey.set(System.getenv('PRIVATE_KEY')) + password.set(System.getenv('PRIVATE_KEY_PASSWORD')) } publishPlugin { - token.set(System.getenv("PUBLISH_TOKEN")) + token.set(System.getenv('PUBLISH_TOKEN')) } } @@ -75,3 +85,5 @@ tasks.register('cargoClean', Exec) { } clean.dependsOn cargoClean + +instrumentedJar.dependsOn shadowJar //TODO: instrumentedJar should use fatjar as input diff --git a/src/main/java/com/codemp/intellij/CodeMP.java b/src/main/java/com/codemp/intellij/CodeMP.java index 8dfb78a..0842950 100644 --- a/src/main/java/com/codemp/intellij/CodeMP.java +++ b/src/main/java/com/codemp/intellij/CodeMP.java @@ -1,8 +1,8 @@ package com.codemp.intellij; -import com.codemp.intellij.util.NativeUtils; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.SystemInfo; +import cz.adamh.utils.NativeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/codemp/intellij/util/NativeUtils.java b/src/main/java/com/codemp/intellij/util/NativeUtils.java deleted file mode 100644 index 6f16447..0000000 --- a/src/main/java/com/codemp/intellij/util/NativeUtils.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Class NativeUtils is published under the The MIT License: - * - * Copyright (c) 2012 Adam Heinrich - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.codemp.intellij.util; - -import java.io.*; -import java.nio.file.FileSystemNotFoundException; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.ProviderNotFoundException; -import java.nio.file.StandardCopyOption; - -/** - * A simple library class which helps with loading dynamic libraries stored in the - * JAR archive. These libraries usually contain implementation of some methods in - * native code (using JNI - Java Native Interface). - * - * @see http://adamheinrich.com/blog/2012/how-to-load-native-jni-library-from-jar - * @see https://github.com/adamheinrich/native-utils - * - */ -public class NativeUtils { - - /** - * The minimum length a prefix for a file has to have according to {@link File#createTempFile(String, String)}}. - */ - private static final int MIN_PREFIX_LENGTH = 3; - public static final String NATIVE_FOLDER_PATH_PREFIX = "nativeutils"; - - /** - * Temporary directory which will contain the DLLs. - */ - private static File temporaryDir; - - /** - * Private constructor - this class will never be instanced - */ - private NativeUtils() { - } - - /** - * Loads library from current JAR archive - * - * The file from JAR is copied into system temporary directory and then loaded. The temporary file is deleted after - * exiting. - * Method uses String as filename because the pathname is "abstract", not system-dependent. - * - * @param path The path of file inside JAR as absolute path (beginning with '/'), e.g. /package/File.ext - * @throws IOException If temporary file creation or read/write operation fails - * @throws IllegalArgumentException If source file (param path) does not exist - * @throws IllegalArgumentException If the path is not absolute or if the filename is shorter than three characters - * (restriction of {@link File#createTempFile(java.lang.String, java.lang.String)}). - * @throws FileNotFoundException If the file could not be found inside the JAR. - */ - public static void loadLibraryFromJar(String path) throws IOException { - - if (null == path || !path.startsWith("/")) { - throw new IllegalArgumentException("The path has to be absolute (start with '/')."); - } - - // Obtain filename from path - String[] parts = path.split("/"); - String filename = (parts.length > 1) ? parts[parts.length - 1] : null; - - // Check if the filename is okay - if (filename == null || filename.length() < MIN_PREFIX_LENGTH) { - throw new IllegalArgumentException("The filename has to be at least 3 characters long."); - } - - // Prepare temporary file - if (temporaryDir == null) { - temporaryDir = createTempDirectory(); - temporaryDir.deleteOnExit(); - } - - File temp = new File(temporaryDir, filename); - - try (InputStream is = NativeUtils.class.getResourceAsStream(path)) { - Files.copy(is, temp.toPath(), StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - temp.delete(); - throw e; - } catch (NullPointerException e) { - temp.delete(); - throw new FileNotFoundException("File " + path + " was not found inside JAR."); - } - - try { - System.load(temp.getAbsolutePath()); - } finally { - if (isPosixCompliant()) { - // Assume POSIX compliant file system, can be deleted after loading - temp.delete(); - } else { - // Assume non-POSIX, and don't delete until last file descriptor closed - temp.deleteOnExit(); - } - } - } - - private static boolean isPosixCompliant() { - try { - return FileSystems.getDefault() - .supportedFileAttributeViews() - .contains("posix"); - } catch (FileSystemNotFoundException - | ProviderNotFoundException - | SecurityException e) { - return false; - } - } - - private static File createTempDirectory() throws IOException { - String tempDir = System.getProperty("java.io.tmpdir"); - File generatedDir = new File(tempDir, NativeUtils.NATIVE_FOLDER_PATH_PREFIX + System.nanoTime()); - - if (!generatedDir.mkdir()) - throw new IOException("Failed to create temp directory " + generatedDir.getName()); - - return generatedDir; - } -}