Как я могу на странице jsp получить номер версии проекта maven? - PullRequest
28 голосов
/ 06 октября 2009

Я работаю над Java-приложением, управляемым maven2. Время от времени мы вносили некоторые изменения и хотим делать новые релизы, конечно же, с новым номером версии. На домашней странице (jsp) есть текст вроде

<b>version:</b> 2.3.3... 

Возможно ли, что каждый раз, когда я делаю новый выпуск, я изменяю только <version/> в pom.xml, и номер версии в jsp может автоматически заполняться этим maven $ {project.version}?

Я пробовал профиль maven, но, похоже, он не работает.

есть идеи?

Спасибо.

Ответы [ 11 ]

31 голосов
/ 06 октября 2009

Вы можете использовать фильтрация проекта для обработки JSP, когда он копируется в целевое местоположение. Если JSP указан с ${project.version}, а содержащая папка указана в качестве местоположения фильтра, то значение должно быть подставлено в JSP по мере его упаковки.

Например, добавление этого в POM включает фильтрацию для src / main / resources:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

Обновление: для упаковки войн вам может понадобиться настроить военный плагин для его фильтрации. См. Filtering раздел документации плагина war-plugin для более подробной информации и примеров.

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

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.0</version>
    <configuration>
      <webResources>
        <resource>
          <directory>src/main/resources</directory>
          <filtering>true</filtering>
        </resource>
      </webResources>
    </configuration>
  </plugin>
</plugins>
11 голосов
/ 06 октября 2009

Возможно, это глупо, но я бы использовал .properties файл, как в в этом примере вместо прямой фильтрации JSP.

2 голосов
/ 22 января 2016

Используйте maven-replacer-plugin

Включите плагин в ваш pom.xml следующим образом:

    <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
        <artifactId>replacer</artifactId>
        <version>(version)</version>
        <executions>
            <execution>
                <phase>prepare-package</phase>
                <goals>
                    <goal>replace</goal>
                </goals>                    
            </execution>
        </executions>
        <configuration>
            <ignoreMissingFile>true</ignoreMissingFile>
            <file>target/someapp/jsp/helloWorld.jsp</file>
            <outputFile>
                target/someapp/jsp/helloWorld-updated.jsp
            </outputFile>
            <regex>false</regex>
            <token>$BUILD_NUMBER$</token>
            <value>${buildNumber}</value>
        </configuration>
    </plugin>

Теперь в любом месте указанного файла с токеном $BUILD_NUMBER$ токен будет заменен.

2 голосов
/ 28 января 2014

Я хотел сделать то же самое, но меня не удовлетворило ни одно из существующих решений, в том числе использование подхода фильтрации Maven, что нормально, но я пытаюсь отойти от изменения существующих файлов кода в процессе сборки поэтому я исключил этот подход, хотя это разумный подход.

Способ получения версии проекта Maven в JSP-файл основан на подходе, аналогичном здесь , за исключением того, что я не создаю файл Version.java, вместо этого у меня просто Maven. запишите версию в файл свойств, такой как "version.properties", например так:

version.properties:

app.version = 0.1

и пусть Maven поместит его в classpath, например, в src / main / resources, например так:

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
          <execution>
            <goals>
              <goal>run</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
            <!-- Idea from link: http://stackoverflow.com/questions/2469922/generate-a-version-java-file-in-maven -->
              <target>
                <property name="resources.dir" value="${project.build.sourceDirectory}/../resources" />
                <property name="version.filename" value="version.properties" />
                <property name="buildtime" value="${maven.build.timestamp}" />
                <echo message="Writing project version string to ${resources.dir}/${version.filename} ..." />
                <echo file="${resources.dir}/${version.filename}" message="app.version = ${project.version}${line.separator}" />
              </target>
            </configuration>
          </execution>
        </executions>
  </plugin>

Кроме того, если вы используете Spring Framework 3.x +, вы можете добавить следующую конфигурацию для загрузки свойств в version.properties, если он существует, в противном случае просто покажите «v0.0» или что-то еще:

@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class WebHomeConfig extends WebMvcConfigurerAdapter implements
    ApplicationContextAware {

  private ApplicationContext _appContext;


  /*
   * (non-Javadoc)
   * 
   * @see
   * org.springframework.context.ApplicationContextAware#setApplicationContext
   * (org.springframework.context.ApplicationContext)
   */
  @Override
  public void setApplicationContext(ApplicationContext appContext)
      throws BeansException {
    _appContext = appContext;
  }

  @Bean
  public ViewResolver getViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    resolver.getAttributesMap().put("appVersion", appVersion);
    return resolver;
  }


  /**
   * Since we don't have any controller logic, simpler to just define
   * controller for page using View Controller. Note: had to extend
   * WebMvcConfigurerAdapter to get this functionality
   * 
   * @param registry
   */
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("home");
  }

  /**
   * The application version.
   */
  @Value("${app.version:0.0}")
  protected String appVersion;

  @Bean
  public static PropertySourcesPlaceholderConfigurer configurer() {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();

    configurer.setIgnoreResourceNotFound(true);
    configurer.setLocations(new Resource[] {
        new ClassPathResource("version.properties")});
    return configurer;
  }

}

И, наконец, в вашем /WEB-INF/views/home.jsp вы можете получить что-то вроде:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Service Status</title>
    </head>
    <body>
        <h1>Service API</h1>
        <p>The service is up and running! (v${appVersion})</p>
    </body>
</html>

И это, конечно, будет выглядеть так:

Сервис запущен и работает! (V0.1)

ПРИМЕЧАНИЕ. Если вы не используете классы JavaConfig для настройки Spring Framework, то вы можете сделать то же самое с конфигурацией Spring XML.

2 голосов
/ 17 февраля 2012

Это время делает этот пост созданным, но я надеюсь, что это поможет. Он получит свойства, сгенерированные из Maven:

<%@ page import="java.util.*"%>
<%
    java.io.InputStream inputStream = getServletContext().getResourceAsStream("/META-INF/maven/com.filhetallard.fam.ged/famdox/pom.properties");
    Properties mavenProperties= new Properties();
    mavenProperties.load(inputStream );
    String version = (String) mavenProperties.get("version");
    String name = (String) mavenProperties.get("artifactId");

%><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head> 
    <title>Application <%= name %> v<%= version %></title>

К сожалению, есть некоторые недостатки:

  • вы должны были явно указать groupId и artifactId в вашем коде
  • если вы развернете свое веб-приложение непосредственно с целевого / на сервер, файл не будет найден, поскольку этот файл находится в каталоге maven-archiver, а не в META-INF, до упаковки.

Привет.

1 голос
/ 07 июля 2016

Я бы вручил .jsp значение

String version = getClass().getPackage().getImplementationVersion();

это будет выглядеть, например, 1.0.0-SNAPSHOT.

Если вы просто получаете нули , вам может потребоваться добавить classpath к Манифесту war с

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
            </manifest>
        </archive>
    </configuration>
</plugin>

для загрузчика классов.

1 голос
/ 26 июня 2015

Родительский pom.xml:

<properties>
        <!-- in my case injected by jenkins build job -->
        <build.version>dev</build.version>
        <build.branch>local</build.branch>
        <build.revision />
 </properties>

Фильтрация ресурсов (заполнители здесь заменяются значениями свойств pom)

<resources>
   <resource>
       <directory>src/main/resources</directory>
       <includes>
            <include>conf/version.properties</include>
       </includes>
       <filtering>true</filtering>
   </resource>
</resources>

Конфигурация бина и заполнителя свойства в webContext.xml:

<context:property-placeholder location="classpath:conf/version.properties"/>

    <bean id="buildVersion" class="de.your.package.cfg.BuildVersion">
        <property name="buildBranch" value="${build_branch}"/>
        <property name="buildVersion" value="${build_version}"/>
        <property name="buildRevision" value="${build_revision}"/>
    </bean>

Ваш боб выглядит так

@Component
public class BuildVersion {

    private String buildBranch;
    private String buildVersion;
    private String buildRevision;

    public String getBuildRevision() {
        return buildRevision;
    }

    public void setBuildRevision(String buildRevision) {
        this.buildRevision = buildRevision;
    }

    public String getBuildVersion() {
        return buildVersion;
    }

    public void setBuildVersion(String buildVersion) {
        this.buildVersion = buildVersion;
    }

    public String getBuildBranch() {
        return buildBranch;
    }

    public void setBuildBranch(String buildBranch) {
        this.buildBranch = buildBranch;
    }

}

А вот и ваш фрагмент JSP:

<%@ page language="java"
   import="java.util.*,
        org.springframework.context.ApplicationContext,
    org.springframework.web.context.support.WebApplicationContextUtils,
         de.smava.kredithai.cfg.BuildVersion" %>
<%
    ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
    BuildVersion buildVersion = (BuildVersion) applicationContext.getBean("buildVersion");

    String branch = (String) buildVersion.getBuildBranch();
    String version = (String) buildVersion.getBuildVersion();
    String revision = (String) buildVersion.getBuildRevision();

    if (request.getParameter("branch") != null){
        out.println(branch);
    } else if (request.getParameter("version") != null){
        out.println(version);
    } else if (request.getParameter("link") != null){
        out.println("<a href=\"http://your_server_url"+branch+"/"+version+"\" >" + branch + " build " + version + "</a>");
    } else {
        out.println(branch + " build " + version + " rev. " + revision);
    }
%>
1 голос
/ 06 октября 2009

Я использую этот плагин,

http://code.google.com/p/maven-substitute-plugin/

Вы можете сделать что-то подобное в Java,

   public final static String projectVersion = "@PROJECT_VERSION@";

и просто передать это значение в JSP.

0 голосов
/ 27 июня 2019

Есть много способов передачи значений (как обсуждено в этих комментариях). Другой подход (который имеет свои плюсы и минусы) заключается в добавлении параметра (ов) в манифест из файла POM:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Build-Version>${project.version}</Build-Version>
                        <Build-Date>${buildDateTime}</Build-Date>
                        <Build-Number>${buildNumber}</Build-Number>
                        <Build-Revision>${buildRevision}</Build-Revision>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

, а затем откройте и прочитайте манифест для установки одноэлементного компонента во время настройки или напрямую импортируйте их в JSP с помощью:

<%
    String buildVersion;
    String buildDate;
    String buildRevision;
    String buildNumber;
    Attributes attributes;
    String version = "";
    InputStream in = null;

    // Get manifest attributes
    try {
        Manifest manifest;

        in = pageContext.getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF");
        manifest = new Manifest(in);
        attributes = manifest.getMainAttributes();
    } catch (Exception ex) {
        attributes = new Attributes();
        attributes.put(new Attributes.Name("Build-Version"), "None (Inplace Deployment)");
    } finally {
        if (in != null) {
            in.close();
        }
    }
    buildVersion = attributes.getValue("Build-Version");
    buildDate = attributes.getValue("Build-Date");
    buildRevision = attributes.getValue("Build-Revision");
    buildNumber = attributes.getValue("Build-Number");
%>

Одним из преимуществ является то, что эта информация также присутствует в манифесте, что позволяет легко найти документацию. Одним из недостатков является необходимость открывать и читать файл манифеста.

0 голосов
/ 02 июня 2015

Вы можете использовать это в своем файле JSP (template.jsp в моем примере)

<head>
<meta name="Historia Social Unica version:${version}" />

Тогда в вашем pom.xml вашего проекта вы должны активировать фильтрацию:

<resources>
  <resource>
    <includes>
       <include>template.jsp</include>
    </includes>
    <directory>src/main/webapp/jsp/template</directory>
    <targetPath>jsp/template/</targetPath>
    <filtering>true</filtering>
  </resource>
 </resources>
</build>

И вы получите свой JSP с замененной версией переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...