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

Как я могу на странице jsp получить номер версии проекта maven?

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

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

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

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

любые идеи?

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

<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>

Ответ 3

Произошло это сообщение, но я надеюсь, что это поможет. Он получит свойства, созданные из 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, перед упаковкой.

С уважением.

Ответ 4

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

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

version.properties:

app.version = 0.1

и Maven поместил его в путь класса, например, в 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, вы можете сделать то же самое с конфигурацией XML Spring.

Ответ 5

Используйте 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$, токен будет заменен.

Ответ 7

Parent 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-property здесь)

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

Bean и конфигуратор заполнителя свойств в 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>

Ваш 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);
    }
%>

Ответ 8

Я передал бы .jsp значение

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

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

Если вы просто получаете нули, вам может потребоваться добавить путь к манифесту 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>

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

Ответ 9

В http://mojo.codehaus.org/jspc/jspc-maven-plugin/usage.html

В нем говорится следующее:
Проекты, не связанные с WAR.

Вы также можете использовать этот плагин с невоенными проектами, например, для проверки JSP. Они будут скомпилированы, но не включены в ваш окончательный артефакт, и файл web.xml не будет создан или изменен.

Если вы хотите просто проверить и скомпилировать свои JSP без фактического включения сгенерированного кода в ваш военный проект, вы также можете установить для параметра includeInProject значение false.

Ответ 10

Вы можете использовать это в своем файле 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 с заменой версии переменной.

Ответ 11

Есть много способов передачи значений (как обсуждено в этих комментариях). Другой подход (который имеет свои плюсы и минусы) - добавить параметр в манифест из вашего файла 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");
%>

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