我们的客户有一个产品(JAVA已实施),不同的客户使用不同的配色方案。我们使用较少的这个和WinLess工具。在我们的CSS文件夹中,我们有以下较少的文件:
customer1.less
customer2.less
customer3.less
style.less
customer*.less
文件包含较少的颜色变量。 style.less
导入这些customer*.less
文件
现在,每当客户想要向特定客户发布新版本的应用时,他都需要将@import
文件名更改为特定的customer*.less
文件名。执行此文件名更改会导致WinLess编译并创建/更新style.css
链接到页面的<head>
。
有没有办法在build time or during tomcat server start
期间自动执行此操作?我在这里做了一些关于Java LESS编译器和一些stackoverflow帖子的研究,但是没有找到任何直接的答案 - 特别是我们在@import
中customer*.less
另一个style.less
文件的部分}。
供参考:
我们为JAVA_OPTS
变量中的不同客户设置了不同的测试配置。同样在application-context.xml
中,我们有来自单个${customer_configuration_name}
文件的customer*.properties
。
考虑到我不是JAVA精通(实际上我是一名Javascript开发人员)而且不了解Maven,Spring等JAVA世界的人,实现此问题的解决方案或提出方法的最佳方法是什么?客户端?
答案 0 :(得分:0)
经过一些研究和试用,我得到了一个使用ServletContextListener
和lesscss-java的解决方案。这是有用的:
添加以下行,以便tomcat可以在服务器启动时调用此类
<listener>
<listener-class>my.app.listener.LessServletContextListener</listener-class>
</listener>
package my.app.listener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.lesscss.LessCompiler;
public class LessServletContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("LessServletContextListener Destroyed");
}
// Run this before web application is started
@Override
public void contextInitialized(ServletContextEvent arg0) {
String cssDir = getCSSDirectory();
String styleLessPath = cssDir + File.separator + "styles.less";
String styleCssPath = cssDir + File.separator + "styles.css";
String vendorLessFilename = getVendorLessFilename();
replaceLessAndCompile(styleLessPath, styleCssPath, vendorLessFilename);
}
public void replaceLessAndCompile(String filePath, String cssPath, String lessFilename) {
try {
String replaceText = "@import \"" + lessFilename + "\";";
FileReader fr = new FileReader( filePath );
BufferedReader br = new BufferedReader(fr);
String line; String existing = ""; String input = "";
while ((line = br.readLine()) != null) {
input += line + '\n';
if(line.startsWith("@import")) {
existing = line;
}
}
br.close();
input = input.replace(existing, replaceText);
FileOutputStream fileOut = new FileOutputStream( filePath );
fileOut.write(input.getBytes());
fileOut.close();
// Instantiate the LESS compiler
LessCompiler lessCompiler = new LessCompiler();
lessCompiler.compile(new File( filePath ), new File( cssPath ));
} catch (Exception e) {
System.out.println("Problem reading file.");
}
}
private String getCSSDirectory() {
return System.getProperty("user.dir") +
File.separator +
".." +
File.separator +
"webapps" +
File.separator +
"css";
}
private String getVendorLessFilename() {
String vendorLessFilename = "default.less";
String vendor = System.getProperty("MY_VENDOR"); // variable set in JAVA_OPTS of catalina.bat
if( vendor.equals("CUSTOMER1") ) {
vendorLessFilename = "customer1.less";
}else if( vendor.equals("CUSTOMER2") ) {
vendorLessFilename = "customer2.less";
}else if( vendor.equals("CUSTOMER3") ) {
vendorLessFilename = "customer3.less";
}
return vendorLessFilename;
}
}
我们在应用LessServletContextListener
中注册了web.xml
。这样tomcat就知道在启动时调用哪个类。启动服务器(tomcat)后,它会调用LessServletContextListener
,自动调用contextInitialized
方法。它获取存在较少文件的CSS目录路径。根据{{1}}中的供应商名称获取特定于供应商的文件名。下一个JAVA_OPTS
方法读取包含replaceLessAndCompile
代码的主styles.less
文件。用客户少的文件名替换它,保存然后lesscss-java编译为@import
。希望它可以帮助某人!如果您发现有更好的方法可以做到这一点,我们非常感谢您的评论。