Подтвердить что ты не робот

Как использовать файл класса из другой войны

У нас есть два разных веб-приложения, и мы хотим расширить несколько контроллеров одной войны в другую войну.

Мы используем maven для создания проекта.

чтобы включить войну, мы дали ее зависимость как

<dependency>
            <groupId>com.abc.exchange</groupId>
            <artifactId>employer</artifactId>
            <version>2.3.M2-SNAPSHOT</version>
            <type>war</type>
            <scope>compile</scope>
        </dependency>

Невозможно создать исключение класса, не найденное.

Может ли любой орган помочь мне в этом, чтобы достичь этого?

Я получаю ошибку maven build failed:

[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project agent-war: Compilation failure: Compilation failure:
[ERROR] \projects\trunk_new\agent\src\main\java\com\platform\agent\web\AgentEmployeeController.java:[22,41] cannot find symbol
[ERROR] symbol  : class EmployeeController
[ERROR] location: package com..platform.employer.web
4b9b3361

Ответ 1

Вы можете определить военный плагин для создания отдельного файла jar, который доступен через классификатор на основе конфигурации :

<configuration>
  ..
  <attachClasses>true</attachClasses>
  <archiveClasses>true</archiveClasses>
</configuration>

После этого вы можете использовать это как отдельную зависимость в других проектах. Но лучше всего сделать из него отдельный модуль jar.

Ответ 2

Что вы делаете, это использовать наложение WAR файла. Maven действительно поддерживает это. Однако...

Плагин WAR работает в фазе package. Любой плагин, такой как компилятор Java (который выполняется на этапе компиляции), который выполняется до этого этапа, не будет видеть файлы, которые был извлечен плагин WAR. (вот список ссылок всех фаз Maven, если это помогает)

Если у вас есть возможность реорганизовать структуру проекта, лучший способ - создать нормальный JAR-проект с вашими контроллерами и обе WAR оттянуть этот JAR в качестве зависимости.

Если есть причина, по которой вы не можете этого сделать, вам нужно будет сделать что-то вроде:

  • Настройте плагин WAR для запуска в фазе раньше compile, например generate-resources, и убедитесь, что он извлекает файлы класса наложения в ${project.build.outputDirectory}.

  • Вы также можете использовать плагин Maven Dependency Plugin unpack для извлечения классов из WAR WAR с ${project.build.outputDirectory}.

Но я рекомендую, если вообще возможно реорганизовать ваши контроллеры в отдельный JAR, это намного проще и удобнее обслуживать.

Ответ 3

установите контроллеры в новый проект jar и сделайте зависимости от ваших веб-проектов для этих контроллеров.

Ответ 4

Добавьте следующие плагины в свой игровой модуль share maven (для одновременного создания артефакта войны и банды):

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>make-a-jar</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>       
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <packaging>jar</packaging>
                        <artifactId>${project.artifactId}</artifactId>
                        <groupId>${project.groupId}</groupId>
                        <version>${project.version}</version>
                        <file>
                            ${project.build.directory}/${project.artifactId}-${project.version}.jar
                        </file>
                    </configuration>
                </execution>
            </executions>
        </plugin> 

затем добавьте зависимость от вашего зависимого модуля войны maven.

Ответ 5

Стандарты видимости Java EE гласят, что классы из одной войны не должны быть доступны классам в другой войне, когда они упакованы как EAR. Большинство контейнеров строго соблюдают это.

Вы должны поместить код, который хотите поделиться в JAR, и включить его в качестве зависимости в войне, которую хотите использовать.

Ответ 6

В военном проекте pom.xml есть

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1.1</version>
        <configuration>
            <attachClasses>true</attachClasses>
        </configuration>
</plugin>

Это создаст ваш-project-0.0.1-SNAPSHOT-clases.jar в целевой папке вместе с войной.

В зависимом проекте pom.xml включает

 <dependency>
        <groupId>com.yourproject</groupId>
        <artifactId>you-project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <classifier>classes</classifier>
  </dependency>

Это сработало для меня. Надеюсь, что это поможет.

Изменить: если мы хотим только некоторые файлы классов в jar, то добавьте это в pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
                <executions>
                    <execution>
                        <id>make-a-jar</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                            <configuration>
                                <classifier>classifier_name</classifier>
                                <includes>
                                    <include>com/../..</include>
                                </includes>
                            </configuration>
                    </execution>
                </executions>
     </plugin>

В зависимом проекте pom.xml включает

 <dependency>
        <groupId>com.yourproject</groupId>
        <artifactId>you-project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <classifier>classifier_name</classifier>
  </dependency>

note: имя классификатора должно быть одинаковым в обоих файлах pom.xml.