formatko
@formatko
Java developer

Как можно с помощью мавена подменить класс в jar'ке?

Имеется jar без исходников. Нужно подменить в нем класс своим классом. Можно ли это сделать мавеном? Пока нашел способ руками (через архиватор) менять класс.
  • Вопрос задан
  • 2477 просмотров
Пригласить эксперта
Ответы на вопрос 2
@gurinderu
java developer
Плохой вариант менять класс в jar
Вы точно уверены, что у этого класса нету наследников, статических полей и прочего?
Если нет, то забудьте.
Ответ написан
formatko
@formatko Автор вопроса
Java developer
Сделал через antrun plugin.
Для продакш профиля все действо происходит в модуле ear.
<!--Патчим сериализаторы в jar'ках ear'ки для продакш сборки-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.6</version>
                        <executions>
                            <execution>
                                <id>repack</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <target>
                                        <!--разархивируем в спец папку-->
                                        <unzip src="${project.build.directory}/ear${releasePostfix}/lib/gwt-user-${gwt.version}.jar"
                                               dest="${project.build.directory}/ant/user"/>
                                        <unzip src="${project.build.directory}/ear${releasePostfix}/lib/gwt-servlet-${gwt.version}.jar"
                                               dest="${project.build.directory}/ant/servlet"/>
                                        <unzip src="${project.build.directory}/ear${releasePostfix}/lib/iask-api-web-${version}.jar"
                                               dest="${project.build.directory}/ant/apiweb"/>

                                        <!--заменяем нужные классы-->
                                        <copy file="${project.build.directory}/ant/apiweb/com/google/gwt/user/client/rpc/core/java/sql/Date_CustomFieldSerializer.class"
                                              todir="${project.build.directory}/ant/user/com/google/gwt/user/client/rpc/core/java/sql/"
                                              overwrite="true"/>

                                        <copy file="${project.build.directory}/ant/apiweb/com/google/gwt/user/client/rpc/core/java/sql/Date_CustomFieldSerializer.class"
                                              todir="${project.build.directory}/ant/servlet/com/google/gwt/user/client/rpc/core/java/sql/"
                                              overwrite="true"/>

                                        <!--собираем в джарки обратно-->
                                        <zip basedir="${project.build.directory}/ant/user"
                                             destfile="${project.build.directory}/ant/toEar/lib/gwt-user-${gwt.version}.jar"
                                             update="true"/>
                                        <zip basedir="${project.build.directory}/ant/servlet"
                                             destfile="${project.build.directory}/ant/toEar/lib/gwt-servlet-${gwt.version}.jar"
                                             update="true"/>

                                        <!--обновление еарки-->
                                        <zip basedir="${project.build.directory}/ant/toEar/"
                                             destfile="${project.build.directory}/ear${releasePostfix}.ear"
                                             update="true"/>

                                        <delete dir="${project.build.directory}/ant"/>
                                    </target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>


Для девмода замена присходит обычным способом - создание в таком же path такого же файла (com/google/gwt/user/client/rpc/core/java/sql/Date_CustomFieldSerializer.class) и так как джарки gwt попадают в war приложения то ручной замены не требуется. А для продакшн режима джарки поставляются через provided и переопределиться кодом не могут, приходится в ручную распаковывать заменять.
Возможно есть и более изящный способ)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект