Nano Hash - криптовалюты, майнинг, программирование

Автоматическая компиляция Less в JAVA для разных клиентских файлов Less

У нашего клиента есть продукт (JAVA Implemented), который используется разными клиентами с разными цветовыми схемами. Мы используем меньше для этого и инструмент 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 и несколько сообщений о потоках стека здесь, но не нашел прямого ответа — особенно ту часть, где мы @import еще один customer*.less файл в основном style.less.

К вашему сведению: у нас есть разные конфигурации тестирования, установленные для разных клиентов в переменной JAVA_OPTS. Также в application-context.xml у нас есть ${customer_configuration_name} из отдельного файла customer*.properties.

Учитывая, что я не разбираюсь в JAVA (на самом деле я разработчик Javascript) и тот, кто не понимает мир JAVA, такой как Maven, Spring и т. д., как лучше всего реализовать решение этой проблемы или предложить подход к клиенту?

24.02.2016

Ответы:


1

Наконец, после небольшого исследования и проб, я нашел решение, используя ServletContextListener и lesscss-java. Вот что сработало:

веб.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, в котором присутствует меньше файлов. Получает специфичное для поставщика меньшее имя файла на основе имени поставщика в JAVA_OPTS. Следующий метод replaceLessAndCompile читает основной styles.less файл, содержащий @import код. Заменяет его именем файла клиента меньше, сохраняет, а затем lesscss-java компилируется в styles.css. Надеюсь, это поможет кому-то! Если вы обнаружили, что есть гораздо лучший способ сделать это, комментарии приветствуются.

03.03.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..