当前位置: 首页 > 知识库问答 >
问题:

Spring Tools Suite和Gradle-设置为使用STS内部的正确资源

红富
2023-03-14

我在Spring Tools Suite(3.7.2版本)中有一个Spring Boot Gradle项目设置,其中包含以下源文件夹:

- src/integration-test/java
- src/integration-test/resources 
- src/main/java
- src/main/resources
- src/test/java
- src/test/resources`

每当我从STS内部运行应用程序或单元测试时,我都会看到STS正在使用src/integration test/resources下的资源。

我在STS中看到一个重复的资源警告,用于所有3个资源源文件夹中存在的文件。例如,我有一个应用程序。所有3个源文件夹中的属性,我看到以下内容:

The resource is a duplicate of src/integration-test/resources/application.properties and was not copied to the output folder

如果我从命令行(通过gradle build)将应用程序作为JAR或单元测试/集成测试运行,那么一切似乎都使用了正确的资源。这让我相信这是STS/Eclipse如何处理gradle的问题。

有人知道在使用gradle时如何配置STS以使用正确的资源源文件夹吗?

我认为我的问题可能与(或与?)有关从eclipse gradle运行时,Spring Boot错误地加载测试配置,https://issuetracker.springsource.com/browse/STS-3882, https://issues.gradle.org/browse/GRADLE-1777

我还尝试了这里找到的解决方案,但这似乎只修复了Maven构建:Spring工具套件找到了Spring Boot集成测试配置,而没有启动主应用程序

共有2个答案

能旭
2023-03-14

我想在@Kris的回答中加上这句话,但太长了。

通过将下面的代码添加到我的构建中,我已经解决了运行时类路径问题。gradle文件。该代码为Spring Boot应用程序类生成Eclipse启动配置,并且只包括运行时类路径(即没有测试JAR)。

我的项目使用Gradle'eclipse'插件来生成Eclipse项目文件(然后我将其导入Eclipse)。运行eclipseClasspathGradle目标将在项目的根目录中生成启动文件。

def mainClassName = "com.example.MyApplication"
task eclipseApplicationLaunch {
    group "IDE"
    description "Generate an Eclipse launch configuration file for the Spring Boot application class"
}
eclipseApplicationLaunch << {
    def writer = new FileWriter("${mainClassName.substring(mainClassName.lastIndexOf(".")+1)}.launch")
    def xml = new groovy.xml.MarkupBuilder(writer)
    xml.doubleQuotes = true 

    xml.launchConfiguration(type: "org.eclipse.jdt.launching.localJavaApplication") { 
        listAttribute(key:"org.eclipse.debug.core.MAPPED_RESOURCE_PATHS") {
            listEntry(value:"/${project.name}/src/main/java/${mainClassName.replace(".","/")}.java")
        }
        listAttribute(key:"org.eclipse.debug.core.MAPPED_RESOURCE_TYPES") {
            listEntry(value:"1")
        }
        listAttribute(key:"org.eclipse.jdt.launching.CLASSPATH") {
            listEntry(value:"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n<runtimeClasspathEntry containerPath=\"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/\" javaProject=\"${project.name}\" path=\"1\" type=\"4\"/>\r\n")
            listEntry(value:"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n<runtimeClasspathEntry path=\"3\" projectName=\"${project.name}\" type=\"1\"/>\r\n")
            configurations.runtime.resolvedConfiguration.resolvedArtifacts.each { artifact ->
                def filePath = artifact.file.canonicalPath.replace("\\","/")
                listEntry(value:"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n<runtimeClasspathEntry externalArchive=\"${filePath}\" path=\"3\" type=\"2\"/>\r\n")
            }
        }
        booleanAttribute(key:"org.eclipse.jdt.launching.DEFAULT_CLASSPATH", value:"false")
        stringAttribute(key:"org.eclipse.jdt.launching.MAIN_TYPE", value:"${mainClassName}")
        stringAttribute(key:"org.eclipse.jdt.launching.PROGRAM_ARGUMENTS", value:"--spring.profiles.active=local --spring.config.location=conf/")
        stringAttribute(key:"org.eclipse.jdt.launching.PROJECT_ATTR", value:"${project.name}")
        stringAttribute(key:"org.eclipse.jdt.launching.VM_ARGUMENTS", value:"-Djava.net.preferIPv4Stack=true")
    }
    writer.close()
}
eclipseClasspath.dependsOn eclipseApplicationLaunch

我还没有修改Eclipse。类路径按照克里斯的建议归档。相反,我将@Profile(“test”)添加到我的测试应用程序类中,并将@ActiveProfiles(“test”)添加到我的测试类中。

萧远
2023-03-14

我想我的问题可能与。。。

是的,这是相关的,但在我看来不一样。该问题是由运行时类路径不正确引起的。这个问题是来自eclipse project builder的一个错误,因此它是一个编译时问题。

然而,这些问题是密切相关的。根据您的观点,您可以说它们是相同的(测试和编译时类路径的不正确混合)。

具体来说,这里的问题是eclipse构建器试图将它在源文件夹中找到的所有资源复制到项目的单个输出文件夹中。每个源文件夹都有一个“application.properties”。构建器警告说它无法复制其中一些,因为一个会覆盖另一个。

我认为这个问题可能有一个解决方案。但这个解决方案真的应该来自Gradle(BuildShip|STS Gradle工具)而不是您。

在Eclipse中,可以将每个源文件夹单独配置为特定的outputfolder。Maven M2E的做法是正确的,但Gradle(Buildship | STS Gradle Tooling)combdos没有。

例如,这就是maven在eclipse中所做的。配置测试资源文件夹时的类路径文件:

    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
         <attributes>
            <attribute name="maven.pomderived" value="true"/>
         </attributes>
     </classpathentry>

请注意它如何显式设置该条目的输出文件夹(与项目的默认输出文件夹不同)。

您可以通过以类似的方式修改gradle项目的. classpath来解决问题。手动或从build.gradle.

但是我不确定这是否值得,因为您可能仍然会受到运行时类路径问题的影响(因为这些文件夹仍然会添加到您的运行时类路径中,因此您的运行时类路径最终会有两个appication.properties资源,一个将“阴影”另一个。请参阅:https://bugs.eclipse.org/bugs/show_bug.cgi?id=482315)

我想说,正确的做法是添加注释到我链接的问题,并希望他们尽快修复它,因为只有这么多你可以做自己通过破解build.gradle文件来修改. classpath(这不能解决运行时类路径问题,但为了解决运行时类路径问题,他们必须配置源文件夹以针对与m2e类似的单个输出文件夹)。

 类似资料:
  • 我有一个项目,使用@Configurable将@Configurable从spring-aspects编译到我的类中。我使用Spring Tool Suite3.7.0,如果我使用gradle任务来构建和启动我的应用程序,我就可以运行所有的东西。(感谢插件:https://github.com/eveoh/gradle-aspectj)。 现在我还想使用AspectJ Eclipse特性。通过将项

  • 问题内容: 我最近改变了自己的道路,因此我可以继续阅读Head First Java书籍,并且之前使用过Eclipse。现在,当我尝试再次使用Eclipse时,它将无法打开,因为它说无法在我的目录中找到要使用的JRE或JDK。我已经移动了JDK文件。我已经下载了jdk1.8.0_60。那么,如何才能再次打开Eclipse? 问题答案: Eclipse不参考变量 您应该指定Eclipse在文件中可以

  • 当尝试运行gradle时,我得到以下错误: 但是,当我检查JAVA_HOME变量时,我得到: 我的JAVA_HOME是在.bashrc中定义的,我仔细检查了它是否被设置为源。 我还检查了符号链接到,而又正确地符号链接到 此外,我还检查了或中没有重复的JAVA_HOME定义。 所以我的问题是Gradle如何/为什么找到,更重要的是我如何将它指向正确的目录? 其他需要JDK的程序工作得很好,所以我认为

  • 问题内容: 尝试运行gradle时,出现以下错误: 但是,当我检查JAVA_HOME变量时,我得到: 我的JAVA_HOME是在.bashrc中定义的,我已经仔细检查过它是否已设置为源。 运行还确认JAVA_HOME设置正确并且在PATH上。 我还检查了符号连接这反过来又正确的符号链接 另外,我检查了或中没有重复的JAVA_HOME定义。 所以我的问题是Gradle如何/为什么找到,更重要的是如何

  • 问题内容: 我正在尝试使用带有剑道分离器的Reactjs。拆分器的样式属性如下 使用Reactjs,如果我正确理解了所有内容,则可以使用内联样式来实现 但是,我也使用Dustin Getz jsxutil尝试将内容拆分成更多部分并具有独立的html片段。到目前为止,我有以下html片段(splitter.html) 和splitter.js组件,该组件按如下方式引用此html 现在,当我运行此命令

  • 所以,我下载了Gradle,但我不知道如何正确设置。解压压缩文件后,我接下来要做什么?我想在IntelliJ IDEA中使用Gradle。从我看到的一条直播流中,我知道有很多设置。格雷德尔和一个身材。IntelliJ中项目文件夹中的gradle文件。 此外,我还看到他们使用windows控制台。 首先,我如何通过windows控制台访问gradle,并告诉它为IntelliJ生成一个新项目? 正如