Ответ 1
Это может быть глупо, но я бы использовал файл .properties
, например, в этот пример вместо прямой фильтрации JSP.
Я работаю над Java-приложением, управляемым maven2. Время от времени мы делали некоторые изменения и хотим делать новые релизы, конечно же, с новым номером версии. На домашней странице (jsp) есть текст, например
<b>version:</b> 2.3.3...
Возможно ли, каждый раз, когда я делаю новый выпуск, я изменяю только <version/>
в pom.xml, а номер версии в jsp может быть автоматически заполнен этим maven ${project.version}?
Я пробовал профиль maven, но он не работает.
любые идеи?
Спасибо.
Это может быть глупо, но я бы использовал файл .properties
, например, в этот пример вместо прямой фильтрации JSP.
Вы можете использовать фильтрацию проекта для обработки 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>
Произошло это сообщение, но я надеюсь, что это поможет. Он получит свойства, созданные из 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>
К сожалению, есть некоторые недостатки:
С уважением.
Я хотел сделать то же самое, но меня не устраивало какое-либо из существующих решений, в том числе использование подхода фильтрации 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.
Используйте 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$
, токен будет заменен.
Я использую этот плагин,
http://code.google.com/p/maven-substitute-plugin/
Вы можете сделать что-то подобное на Java,
public final static String projectVersion = "@[email protected]";
и тривиально передать это значение в JSP.
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);
}
%>
Я передал бы .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>
для загрузчика классов.
В http://mojo.codehaus.org/jspc/jspc-maven-plugin/usage.html
В нем говорится следующее:
Проекты, не связанные с WAR.
Вы также можете использовать этот плагин с невоенными проектами, например, для проверки JSP. Они будут скомпилированы, но не включены в ваш окончательный артефакт, и файл web.xml не будет создан или изменен.
Если вы хотите просто проверить и скомпилировать свои JSP без фактического включения сгенерированного кода в ваш военный проект, вы также можете установить для параметра includeInProject значение false.
Вы можете использовать это в своем файле 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 с заменой версии переменной.
Есть много способов передачи значений (как обсуждено в этих комментариях). Другой подход (который имеет свои плюсы и минусы) - добавить параметр в манифест из вашего файла 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");
%>
Одним из преимуществ является то, что эта информация также присутствует в манифесте как легко найти документацию. Одним из недостатков является необходимость открывать и читать файл манифеста.