Java中的SASS实现?

77

我正在寻找Java中的SASS实现(可与JSP / JSF一起使用)。 对于Python,我已经找到了CleverCSS,但是对于Java没有类似工具生成CSS。 有没有人听说过这种用于生成CSS的工具?


3
SASS/SCSS 是用 Ruby 开发的。为了获得最好和最新的功能,最好使用 Ruby 而不是 Java 的本地实现。本地实现也会落后于最新和最伟大的功能。 - Joep
5
@Joepie,对我来说,比起拥有最新版本,拥有更少的依赖关系更为重要。目前SASS/SCSS已经能够满足我的需求。我只是想要一个轻量级的使用方法。 - Sam Hasler
2
此外,仅仅因为某些东西不是“原生”的实现,并不意味着它会自动过时。可以使用机器翻译,或者一个充满热情的开发人员可以使其保持最新状态。 - Sam Hasler
有一款新的快速而纯净的Java编译器https://github.com/i-net-software/sass-compiler。 - Horcrux7
12个回答

49

使用ANT:

  1. 下载JRuby完整的jar文件 (JRuby完整版下载页面)。
  2. 下载最新的HAML/SASS代码 (HAML/SASS tarball),并解压缩。将其放在"/libs/sass-[VERSION]"目录下。
  3. 将以下内容添加到ant构建文件中。
  4. 在脚本中替换[VERSION]为相应版本的JRuby和SASS。
  5. 运行ant脚本,sass或scss文件将被编译!

<path id="JRuby">
    <fileset file="libs/jruby-complete-[VERSION].jar"/> <!-- Location of JRuby jar file -->
</path>  

<target name="compileSCSS">
    <echo message="Compiling scss files..." />
    <property name="filesIn" value="${dir.css}/scss/**/[^_]*.scss" />
    <property name="fileOutDir" value="/${dir.css}/${dir.css.build}" />
    <script language="ruby" classpathref="JRuby">
        <![CDATA[
            require 'libs/sass-[VERSION]/lib/sass'
            require 'sass/exec'

            files = Dir.glob($project.getProperty('filesIn'))
            Dir.mkdir($project.getProperty('fileOutDir')) unless File.exists?($project.getProperty('fileOutDir'))
            files.each do 
                | file |
                puts "     [sass compiler] " + file + " -> " + $project.getProperty('fileOutDir') + "/" + File.basename(file, ".*") + ".css"
                opts = Sass::Exec::Sass.new(["--load-path", File.dirname(file), file, File.join($project.getProperty('fileOutDir'), File.basename(file, ".*") + ".css")])
                opts.parse
            end
        ]]>
    </script>
    <echo message="Done compiling scss files!" />
</target>

使用MAVEN:

Maven也可以做到这一点:通过使用antrun插件:

<project>
<build>
<plugins>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>compileAndMinify</id>
            <phase>compile</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <mkdir dir="${project.build.directory}/compiled" />

                    <echo message="Compiling scss files..."/>
                    <path id="JRuby">
                        <fileset file="${basedir}/jars/jruby-complete-[VERSION].jar"/>
                    </path>
                    <property name="filesIn" value="${project.build.directory}/css/**/[^_]*.scss" />
                    <property name="fileOutDir" value="${project.build.directory}/compiled/css" />
                    <script language="ruby" classpathref="JRuby">
                        <![CDATA[
                            require 'libs/sass-[VERSION]/lib/sass'
                            require 'sass/exec'

                            files = Dir.glob($project.getProperty('filesIn'))
                            Dir.mkdir($project.getProperty('fileOutDir')) unless File.exists?($project.getProperty('fileOutDir'))
                            files.each do 
                                | file |
                                puts "     [sass compiler] " + file + " -> " + $project.getProperty('fileOutDir') + "/" + File.basename(file, ".*") + ".css"
                                opts = Sass::Exec::Sass.new(["--load-path", File.dirname(file), file, File.join($project.getProperty('fileOutDir'), File.basename(file, ".*") + ".css")])
                                opts.parse
                            end
                        ]]>
                    </script>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>
</plugins>
</build>
</project>  

1
由于某些原因,对我来说 require 'libs/sass-[VERSION]/lib/sass' 作为相对路径无法工作,我不得不使用手头的属性来提供绝对路径。所以我使用了 require $project.getProperty('project.root') + '/sass/sass-3.2.9/lib/sass' - L. Holanda
有人在Mac上试过这个吗?在Windows上手动在命令提示符中调用ant目标时,它运行得很好。在hudson下也正常工作。但是一个使用Mac的队友遇到了这个错误:执行此行时发生以下错误:build.xml:171: org.jruby.exceptions.RaiseException: odd number of args for Hash (我的build.xml的第171行是<script>标签的开始) - L. Holanda
1
嗨Joepie,HAML/SASS的链接似乎已经失效了,如果可能的话,你能更新一下链接吗? - bummi
尝试使用https://github.com/nex3/sass/archive/stable.zip。我不知道它是否仍然可以这样使用,但你可以尝试一下... - Joep
对于使用Maven插件片段的人,请注意:<configuration><execution>标签的结尾缺少/字符。我尝试编辑答案,但编辑必须至少为6个字符,所以这是我能做到的最好的。 - Mike
显示剩余9条评论

19

ZUSS是一种很好的替代LESS和SASS的选择。它与LESS相似。与LESS和SASS不同的是,处理ZUSS文件不需要JavaScript解释器。

声明:我是ZUSS的开发者。我之所以开发它,仅仅是因为我找不到一个简洁的Java解决方案。


在我看来,Zuss 是最适合 Java 环境的工具,比如 Java 方法调用、变量解析器和资源定位器。 - Mo.
哇,好棒的解决方案。我会考虑在未来的Java项目中使用!真的很棒。您是否有关于在使用Servlet时缓存的更多信息?文档对此并不清楚...使用Servlet时编译步骤有多快? - Joep
1
默认的servlet不提供任何缓存。如果您愿意,可以进行扩展。 - Tom Yeh
GitHub 位置:https://github.com/tomyeh/ZUSS; Maven 存储库:https://mvnrepository.com/artifact/com.github.tomyeh/zuss/1.0.0-FL-2012-03-20 - nikodaemus

14

我只是出于信息充足的利益而说,上述项目使用犀牛运行JavaScript文件。 - mP.
3
jsass看起来像是被抛弃的软件。因为asual的lesscss-servlet更好用,所以我点了赞。 - Sam Hasler

10
您还可以查看Web Resource Optimizer 4 J (WRO4J),它允许进行多个操作(压缩、资源合并),并支持Less CSS(据我所知,可以在运行时进行)。
这意味着:您将wro4j过滤器添加到web.xml中,当您请求CSS时,scss(或saas)文件会被编译为标准CSS。
我还没有使用过它,但它似乎比此处列出的其他产品更为先进。
事实上,我正在阅读Less for Java网站(http://www.asual.com/lesscss/)上的评论,WRO4J使用该库提供了“即时Less编译”。因此,我认为选择Less for Java是正确的方法。

7

5
我个人认为SASS语法非常令人讨厌。对于Ruby/Python的开发者来说,这可能是很自然的事情;但对于像我一样的Java程序员来说就不是那么简单了。我强烈推荐LESS,它基于CSS语法而构建,而不是创造一种新的语法。这有一个很好的优点,就是可以直接使用现有的CSS文件,并根据需要使用LESS功能。
话虽如此,据我所知,SASS和LESS都没有Java端口。它们都是基于Ruby的,但是你可以在JRuby下安装它们。这种方法唯一的问题是JRuby启动速度非常慢。不过这并不是什么大问题,因为你很可能会在开发中使用文件监控(一旦启动后运行非常平稳),并且在部署期间,你也不太关心构建需要多花几秒钟。
还有一些基于PHP的实现,比如LessPhpxCSS等等。不过我个人没有尝试过。

3
Sass语法已经变得简化:现在很像CSS而没有花括号。即将推出的Sass版本将允许使用可选的花括号。Sass的一个优点是编译器和工具比Less更成熟。IntelliJ 9支持Sass(安装Ruby插件即可)。我们从Less转换到Sass主要是因为编辑器的支持。我现在比Less更喜欢它(父级引用'&'是非常有价值的)。css2sass工具使得将CSS文件转换为Sass非常容易,它也会尽可能地嵌套选择器。我们将一个大型项目转换过来后,并没有遇到任何问题。 - jeremyh
我也讨厌Sass语法。虽然它被认为更易于查看,但花括号对我来说更容易。 - Ruan Mendes
10
顺便说一下,现在有 SCSS 语法,它使用大括号。 - Debilski

4

1
@SamHasler,你为什么喜欢没有依赖呢?除了可能会改变许可证/破坏/膨胀你的代码库之外,即使是Maven本身也有大量的依赖...实际上,任何好的东西都有很多依赖,这也是开源的好处之一,不是吗? - Eran Medan
如果我的某个依赖项出现问题,我希望能够进入其中并自行修复。我不懂ruby,因此希望使用其他编程语言来构建它。 - Sam Hasler
1
sass-maven-plugin 的作者在此。除非有人完全重写了 Java 中的 SASS,否则始终需要 jRuby。这样做会更加稳定,因为提供的工具中使用的相同 SASS 代码也被 maven 插件所使用。 - Eric
@Eric - 谢谢,有点跑题了,没能让它工作,不确定该在皮肤参数中放什么,将会开一个 GH 问题... - Eran Medan
我认为专门为Sass构建的插件是最佳解决方案,而且我不认为依赖关系很重要。话虽如此,我还是无法让这个插件工作,我认为这是一个JRuby的问题。 - Snekse
显示剩余3条评论

3

考虑到SASS必须转换为CSS才能使用,使用分发Ruby SASS的sass2css有什么问题吗?


3

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接