Path Gradle工件依赖性-工件工件-如何找到路径

Path Gradle工件依赖性-工件工件-如何找到路径,path,find,gradle,artifactory,resolve,Path,Find,Gradle,Artifactory,Resolve,构建Java/Groovy项目时,各种任务(如compileJava、compileGroovy、test等)都需要各种jar构件,如果您已经正确定义了该任务的每个领域所需的内容,Gradle就会提供这些构件 我正在将它们提供给构建脚本(build.gradle),并且一切都很好 我正在处理的另一个项目不仅需要jar事实,还需要一个.xml文件作为工件来进行JIBX/XSLT转换/处理 我的简单问题是: -Gradle构建过程知道如何从Artifactory(正如我在init.d/common

构建Java/Groovy项目时,各种任务(如compileJava、compileGroovy、test等)都需要各种jar构件,如果您已经正确定义了该任务的每个领域所需的内容,Gradle就会提供这些构件

我正在将它们提供给构建脚本(build.gradle),并且一切都很好


我正在处理的另一个项目不仅需要jar事实,还需要一个.xml文件作为工件来进行JIBX/XSLT转换/处理

我的简单问题是: -Gradle构建过程知道如何从Artifactory(正如我在init.d/common.Gradle文件中提到的那些Artifactory存储库)获取工件,并且在构建过程中,它使用这些JAR为编译/测试等任务提供信息,现在如果我也将这个.xml工件上传到Artifactory,那么:

a。如何在build.gradle中获得可用的.xml工件,以便对其执行一些操作;例如:将该.xml文件复制到结果项目的jar/war文件中的x/y/z文件夹中。这些jar文件我可以通过project.configurations.compile.each或.find或类似的方式访问,但我不确定是否可以以同样的方式访问.xml文件。下面的代码可以很好地解除build/tmpJibx/文件夹中jar文件的共享,即如果我在构建过程中需要httpunit-1.1.1.jar,那么调用下面的函数时,将在build/tmpJibx/httpunit文件夹中创建/解除这个jar

// Unpack jar
def unpackJarItem( jarName ) {
   println 'unpacking: ' + jarName
   def dirName = "$buildDir/tmpJibx/$jarName"
   new File( dirName ).mkdirs()
   project.configurations.compile.find {
      def nameJar = it.name
      def iPos = nameJar.lastIndexOf( '-' )
      if( iPos > 0 ) {
         nameJar = nameJar.substring( 0, iPos )
         if( nameJar == jarName ) {
            def srcJar = it.toString()
            ant {
               unjar( src: "$srcJar", dest: "$dirName" )
            }
         }
      }
   }
}
Gradle将工件保存在用户的缓存中(home directory in ~/.Gradle)或C:\Users\.Gradle下的…\caches..\artifactory..\filestore*

我所要做的就是: 如果我能做到以下几点:

copy {
      into "build/war/WEB-INF/conf"
      from "......<THIS_PATH_IS_WHAT_Im_LOOKING_FOR>:
      include "thatxmlartifactfile.xml"
}
似乎我必须首先将.xml从Gradle知道它可用的地方复制到某个位置,然后从该位置复制到我的目标文件夹

   // Add libraries for acceptance tests
   project.configurations.acceptanceTestCompile.each { File f ->
      if( f.isFile() ) {
         def nameJar = f.getName()
         def jarName = f.getName()
         def fileInc = true
         def iPos = nameJar.lastIndexOf( '-' )
         if( iPos > -1 ) {
            jarName = nameJar.substring( 0, iPos )

            // Here I can say that one of the file/entry will be that .xml file
            // Now I have that in jarName variable and I can play with it, right?
            // i.e. if jarName == name of that xml file, then 
            copy {
                  into "some/folder/location"
                  from jarName
            }
         }
      }
   }

最简单的解决方案是将XML文件提交给源代码管理。如果将它放在
src/main/webapp/WEB-INF/conf/thatxmlartifactfile.xml
下,它将自动包含在War中

如果需要从Artifactory获取文件,可以按如下操作:

configurations {
    jibx
}

dependencies {
    jibx "some.group:someArtifact:1.0@xml"

war {
    from { configurations.jibx.singleFile }
}

PS:通常情况下,直接将文件添加到最终归档中是可能的,而且更可取,而不是经过中间复制步骤。

我同意皮特的观点,这就是答案——对我来说是长期的。我们计划在项目的jar文件中包含该.xml,这样一旦该jar被取消共享,我就可以通过“build/tmpJibx/jarfolder/conf”并包含“file.xml”来获取它。但同时,我也很好奇,因为我们有很多项目的jar被其他项目使用,它们也会生成这样的.xml/etc文件,这些文件也会被使用。长期的解决方案是在.jar中包含所有这样的文件,当我们需要它时,我们就有了它。我也试试你说的。你同意我上次的更新(帖子的底码)吗?你的代码太复杂了。请参阅我的答案,以获得更简单的解决方案。同意,但我将其用于其他目的,即处理所有.xxx工件。但是你提到的.xml对我来说很有意义。谢谢,皮特。嘿,皮特,什么是singleFile。你的意思是我必须使用thatxmlartifactfile来代替你在war任务中提到的singleFile关键字吗?你应该按原样使用代码。这是在调用
配置#getSingleFile
。有关详细信息,请参阅。
configurations {
    jibx
}

dependencies {
    jibx "some.group:someArtifact:1.0@xml"

war {
    from { configurations.jibx.singleFile }
}