简体   繁体   中英

Gradle include all files under a directory ('recursively')

So I've been making a Java project using Gradle ( GitHub ), but it uses/needs JNI (natives).

I was first using Makefiles to compile and link the C++ code, but then I found out how to compile and link C++ natives using Gradle, so I got all of that working. But now I am stuck, because I can't find a way to include all natives, on the same level (base) inside of the JAR file. NOTE: I don't need help with compiling the natives, only with including/packaging them.

EDIT: I just commited the changes to GitHub.

This is my directory structure:

[Project Directory]
 - build.gradle
 - src/
 - win32/ (the only native library that i currently have)
     - cpp/
 - main/
     - java/
 - build/
   - libs/ (here is the JAR and the natives)
     - win32/ (the natives)
       - shared/ (the dynamic link libraries, i only want these)
          - x64/ (i want to include both x64 and x86)
             - mylibrary.dll (just the DLLs should be included)
             - mylibrary.ext
             - mylibrary.lib
          - x86/

So there are a few criteria:

  • I only want the DLL files, none of the .ext and .lib stuff.
  • I want to be able to dynamically change the amount of libraries and the names of the natives.

What I have tried:

My first attempt was just looping through all folders. I didn't have to use recursion because the depth of the file structure is fixed, so it will never be further from or closer to the build/libs directory. This is how I tried coding it:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources"

            // include natives
            String libfp = "${buildDir}/libs/"
            File   libf  = new File(libfp);
            if (!libf.exists())
                libf.mkdir();

            FileFilter isDir = f -> f.isDirectory();
            FileFilter isDll = f -> f.getAbsolutePath().endsWith(".dll");

            for (File file : libf.listFiles(isDir)) { // iterate "libs" to find all libraries
                // enter "shared"
                File filen = new File(file.getAbsolutePath() + "/shared/"); 
                for (File file1 : filen.listFiles(isDir)) { // iterate over "shared" to find all platforms
                    for (File file2 : file1.listFiles(isDll)) { // get all dlls
                        include(file2.getAbsolutePath())
                    }
                }
            }
        }
    }
}

This worked, except from the including itself. I don't know if I understand how this works correctly, but the include function didn't seem to add anything to the resources.

Then, I checked the documentation and found it was a pattern based function, so I tried making a simple include call with the pattern I thought would work:

include "/build/libs/**/*.dll"
// I also tried the following:
include "/build/libs/**.dll"
include "/build/libs/*.dll"

But that didn't seem to work too. So I think I am just misunderstanding how the include function works.

Just use

include '/build/libs/**'

will work. Thanks.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM