Maven将WEB-INF /类添加到JAR依赖项中

时间:2015-02-24 17:03:55

标签: maven-3 spring-boot

  

更新:解决了!发布解决方案作为我自己的答案我被允许在两天内接受它。

一个小故事

过去几天我一直在追逐这个兔子洞,我的问题在那个时候已经彻底改变了形状。最初,我认为Spring Boot存在问题,因为它无法解析我的@Configuration个注释类之一。调试一下,我确定Spring正在查找我的JAR绑定依赖项的所有正确位置,但在尝试从{{1}加载类时遇到FileNotFoundException }。

我被这个抛弃了,因为所讨论的JAR在类路径上是非常可验证的。我可以在应用启动期间打印出类路径,并看到我的JAR内部生活得很舒适。

所以我简化了。并简化。最后,我把事情归结为一个包含两个Java源文件的项目,以及一个小的占位符JAR通过JAR。此Maven仅包含一个文件:JAR

这完美无缺。从那里,我在这个小项目上交换了依赖tiny/jar/BaseTest.class。 。 。并且启动失败。所以我比较了JAR并发现了一些奇怪的东西。

实现

虽然我的小JARs包含文件夹层次结构:

JAR

较大的tiny/jar/BaseTest.class 看起来像:

JAR

这个WEB-INF/classes/com/company/... 前缀是杀死WEB-INF/classes类加载器的毒药。它期望从根开始查找类:Spring Boot - 不允许使用前缀。

我相信Maven的依赖管理在这里做了一些棘手的事情。使用com/company/...目标创建JAR时,其中包含clean install根。如果我将此版本的com/company/...手动复制到我的服务器JAR文件夹中,则所有内容都能正常运行,识别并完全启动。

但是当使用Maven引入依赖关系时,WEB-INF/lib会在我的文件夹层次结构上加上前缀,从而破坏所有内容。

问题

有谁知道如何阻止Maven改变WEB-INF/classes的目录结构? JAR是100%正确的,直到Maven将其作为依赖项拉出来,突然出现JAR前缀。

以下是三个WEB-INF/classes文件供参考。我已经删除了大量的依赖关系,但保留了其他所有内容以便于阅读。

Tiny Jar POM

POM

Big Jar POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>tiny</groupId>
<artifactId>jar</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<name>jar</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
</properties>


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
</project>

Project POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.company</groupId>
<artifactId>company-foundation</artifactId>
<version>0.7.0-SNAPSHOT</version>
<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.ws</groupId>
        <artifactId>spring-ws-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.ws</groupId>
        <artifactId>spring-ws-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.webflow</groupId>
        <artifactId>spring-webflow</artifactId>
        <version>2.4.0.RELEASE</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin> <!--  Sonar -->
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>sonar-maven-plugin</artifactId>
            <version>2.5</version>
        </plugin>
    </plugins>
</build>

<repositories>
    <!-- To use snapshots, you must also use the Sonatype Snapshots respository -->
    <repository>
       <id>sonatype-snapshots</id>
       <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </repository>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>


</project>

1 个答案:

答案 0 :(得分:3)

解决了我的问题!我刚刚完成了对项目配置的研究,并将它们与任何可疑的偏差进行比较。事实证明,JAR中较大的Eclipse项目的Deployment Assembly(在“属性”和“部署程序集”下找到)设置为:

来源============部署路径

src/main/java --------&gt; /WEB-INF/classes

src/main/resources - &gt; /WEB-INF/classes

这导致我的服务器将JAR部署到内部/WEB-INF/classes文件夹中。

Deploy Path设置更改为/解决了问题!现在一切都很完美!宇!