JAVA中的自动编译较少,适用于不同客户的较少文件

时间:2016-02-24 10:50:31

标签: java spring maven less

我们的客户有一个产品(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帖子的研究,但是没有找到任何直接的答案 - 特别是我们在@importcustomer*.less另一个style.less文件的部分}。

供参考: 我们为JAVA_OPTS变量中的不同客户设置了不同的测试配置。同样在application-context.xml中,我们有来自单个${customer_configuration_name}文件的customer*.properties

考虑到我不是JAVA精通(实际上我是一名Javascript开发人员)而且不了解Maven,Spring等JAVA世界的人,实现此问题的解决方案或提出方法的最佳方法是什么?客户端?

1 个答案:

答案 0 :(得分:0)

经过一些研究和试用,我得到了一个使用ServletContextListenerlesscss-java的解决方案。这是有用的:

的web.xml:

添加以下行,以便tomcat可以在服务器启动时调用此类

<listener>
        <listener-class>my.app.listener.LessServletContextListener</listener-class>
</listener>

LessServletContextListener.java

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。希望它可以帮助某人!如果您发现有更好的方法可以做到这一点,我们非常感谢您的评论。